如何以标准方式组合来自type_traits的条件
How to combine conditions from type_traits the standard way
例如,仅当std::is_pointer<T>
和std::is_const<T>
求值为true_type
时,我想使用类型T
。
当然,还有一种简单的方法:
template <typename T>
void f(T t, std::true_type, std::true_type) {}
template <typename T>
void f(T t)
{
f(t, std::is_pointer<T>{}, std::is_const<T>{});
}
但是我想要这样的:
template <typename T>
void f(T t, std::true_type) {}
template <typename T>
void f(T t)
{
f(t, std::and<std::is_pointer<T>, std::is_const<T>>{});
}
标准库包含std::and
之类的东西吗?如果没有,是否有一种简单的方法来实现所需的功能?
您可以简单地将性状的结果&&
放在一起,并将它们放在std::integral_constant
中:
std::integral_constant<bool,
std::is_pointer<T>::value && std::is_const<T>::value>
或者你可以写一个通用特性and
。这里有一些可能性:
选项1 :
template<typename... Conds>
struct and_
: std::true_type
{ };
template<typename Cond, typename... Conds>
struct and_<Cond, Conds...>
: std::conditional<Cond::value, and_<Conds...>, std::false_type>::type
{ };
//usage
and_<std::is_pointer<T>, std::is_const<T>>
选项2 :
template<bool...> struct bool_pack;
template<bool... bs>
using and_ = std::is_same<bool_pack<bs..., true>, bool_pack<true, bs...>>;
//usage
and_<std::is_pointer<T>, std::is_const<T>>
当我们得到折叠表达式时,你可以这样做:
template<typename... Args>
using and_ = std::integral_constant<bool, (Args::value && ...) >;
你的编译器可能已经在-std=c++1z
标志下支持这个
随着c++ 17连接和析取的出现,您可以轻松地组合可变(数量)谓词:
template <class T, template <class> class... Ps>
constexpr bool satisfies_all_v = std::conjunction<Ps<T>...>::value;
template <class T, template <class> class... Ps>
constexpr bool satisfies_any_v = std::disjunction<Ps<T>...>::value;
你可以这样使用它:
satisfies_all_v<T, is_pointer, is_const>
相关文章:
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 控制到达非空函数clang(-Wreturn-type)的末尾
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 如何将 std::ifstream 转换为 std::basic_istream<CharT, Traits>&?
- 将系数存储在头文件的数组中("does not name a type"错误)
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在"结构提升::enable_if<提升::is_pod<T>,无效>"中没有名为"type"的类型
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- OpenCV CV_16F type
- C++ "错误:在'类 std::result_of< ... >"中没有名为'type'的类型"
- 将内存分配返回值强制转换为 TYPE 数组
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- reference_wrapper导致"incomplete type is not allowed"
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 由于"error C4430: missing type specifier - int assumed. Note: C++ does not support default-int",我现在无法编
- cv::D ataType<> 与 cv::traits::Type<>