【问题标题】:How to check if all of variadic template arguments have special function?如何检查所有可变参数模板参数是否具有特殊功能?
【发布时间】:2014-07-29 07:39:13
【问题描述】:

说明:

检查模板参数中是否存在特殊运算符很容易(借助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[]'?);
};

我该怎么办?

【问题讨论】:

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


    【解决方案1】:

    只需将其应用于每种类型并将其与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");
    };
    

    【讨论】:

      【解决方案2】:

      我想简化@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 ... >{};
      

      【讨论】:

      • 您应该将 (b,true) 替换为 (b||true),因为前者会导致 GCC 上出现有关 left operand of comma operator has no effect 的警告。
      猜你喜欢
      • 2015-03-30
      • 2016-06-27
      • 2021-05-30
      • 2018-10-25
      • 2017-07-13
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多