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

标签 c++ function templates c++11 variadic-templates

解释:

检查模板参数中是否存在特殊运算符很容易(借助 answer )。

以下代码检查 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));
};

ideone

问题:

现在我想检查我的可变参数模板参数是否都有那个运算符。我不知道如何将它们一个一个地发送到 HasStringOperator 并检查整个结果。

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

我该怎么办?

最佳答案

只需将它应用于每种类型并将其与 true 数组进行比较即可。

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");
};

关于c++ - 如何检查所有可变参数模板参数是否具有特殊功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24108852/

相关文章:

mysql - Doctrine2 Symfony2 自定义函数解析器

c++ - 将 C++ std::bind 替换为 lambda 的右值引用和可变模板

c++ - 具有不同数组实现的子类

C++ vector 按值 : did I get it right? 传递

c++ - 带有 Boost::Beast 的 SSL 隧道

c++ - QScintilla 如何连续获取文本编辑小部件中的光标位置?

javascript - 更改 Kendo UI 中的语言

python - 将函数与笔记本目录中其他 python 文件中的变量一起使用

c++ - "unpacking"调用匹配函数指针的元组

c# - 构建期间未转换的 T4 模板