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 ... >{};