C++ 如何检查所有可变模板参数是否具有特殊功能?
说明: 检查模板参数中是否存在特殊运算符很容易(借助于此) 以下代码检查C++ 如何检查所有可变模板参数是否具有特殊功能?,c++,function,templates,c++11,variadic-templates,C++,Function,Templates,C++11,Variadic Templates,说明: 检查模板参数中是否存在特殊运算符很容易(借助于此) 以下代码检查Type中是否存在char运算符[]: template <class Type> class HasStringOperator { template <typename T, T> struct TypeCheck; typedef char Yes; typedef long No; template <typename T> struct oper
Type
中是否存在char运算符[]
:
template <class Type>
class HasStringOperator
{
template <typename T, T> struct TypeCheck;
typedef char Yes;
typedef long No;
template <typename T> struct operator_{
typedef char (T::*fptr)(int);
};
template <typename T> static Yes HasOperator(TypeCheck< typename operator_<T>::fptr, &T::operator[] >*);
template <typename T> static No HasOperator(...);
public:
static bool const value = (sizeof(HasOperator<Type>(0)) == sizeof(Yes));
};
我该怎么办?只需将其应用于每种类型,并将其与
true
s数组进行比较
template <bool... b>
struct BoolArray {};
template <class... TS>
struct DenyType : true_type {};
template <class... World>
class Sentence {
static_assert(is_same<
BoolArray<(HasStringOperator<World>::value)...>,
BoolArray<(DenyType<World>::value)...>
>::value, "WUT");
};
模板
结构BoolArray{};
模板
结构DenyType:true_type{};
模板
类别句{
静态断言(是否相同<
布拉瑞,
布拉雷
>::值,“WUT”);
};
我想要simplify@polkovnikov.ph的答案:
template< bool ... b> struct BoolArray{};
template< bool ... b> struct ctx_all_of: std::is_same< BoolArray<b...>, BoolArray<(b,true)...> >{};
template< class... World>
struct Sentence: ctx_all_of< HasStringOperator<World>::value ... >{};
模板 结构BoolArray{};
模板 struct ctx_all_of:std::is_same{};
模板<类。。。世界>
结构句子:ctx_all_of{};
应将(b,true)
替换为(b | | true)
,因为前者会导致有关逗号运算符的左操作数的警告对GCC没有影响。
template< bool ... b> struct BoolArray{};
template< bool ... b> struct ctx_all_of: std::is_same< BoolArray<b...>, BoolArray<(b,true)...> >{};
template< class... World>
struct Sentence: ctx_all_of< HasStringOperator<World>::value ... >{};