Одна вещь, которую вы можете сделать, это создать новую черту, которая является conjunction
из черт, которые вы хотите проверить. Поскольку вы хотите, чтобы отрицание всех этих черт буквально перевелось бы на
template<typename T>
using my_trait = std::conjunction<std::negation<std::is_const<T>>,
std::negation<std::is_reference<T>>,
std::negation<std::is_pointer<T>>>;
static_assert(my_trait<int>::value, "");
, но использование std::negation
для каждой черты - это боль. Вы можете избавиться от этого, используя std::disjunction
, чтобы получить «или» всех черт, а затем просто отрицать значение в статическом утверждении, как вы делаете, что дает вам
template<typename T>
using my_trait = std::disjunction<std::is_const<T>,
std::is_reference<T>,
std::is_pointer<T>>;
static_assert(!my_trait<int>::value, "");