如何检查所有可变参数模板参数是否具有特殊功能?

LxL*_*LxL 8 c++ templates function variadic-templates c++11

说明:

检查模板参数中是否存在特殊运算符很容易(借助此答案).

以下代码检查是否char operator[]存在Type:

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));
};
Run Code Online (Sandbox Code Playgroud)

ideone

问题:

现在我想检查我的所有可变参数模板参数是否都有该运算符.我无法弄清楚如何逐个发送它们HasStringOperator并检查整个结果.

template < class... Word>
class Sentence
{
    static_assert(Do all of Words have 'char operator[]'?);
};
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

pol*_*.ph 6

只需将它应用于每种类型,并将其与trues 数组进行比较.

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");
};
Run Code Online (Sandbox Code Playgroud)