对可变参数模板功能的误解

时间:2019-11-25 17:02:58

标签: c++ variadic-templates

我不确定如何从我编写的可变参数模板函数中获得特定效果。下面是我编写的函数。

template<typename ... T>
bool multiComparision(const char scope, T ... args) {
    return (scope == (args || ...));
}

有人向我指出,尽管没有在较大的代码范围内创建任何错误,但这实际上执行了与所需操作不同的操作。

multiComparision('a', '1', '2', '3');

=>
   return ('a' == ('1' || '2' || '3'));

我实际上打算让该函数返回以下内容

multiComparision('a', '1', '2', '3');

=>
   return ('a' == '1' || 'a' == '2' || 'a' == '3');

我如何达到预期的效果?

2 个答案:

答案 0 :(得分:5)

  

我如何达到预期的效果?

将等式比较表达式括在括号中

template<typename ... T>
bool multiComparision(const char scope, T ... args) {
    return ((scope == args) || ...);
}

live example on godbolt.org


C ++ 14解决方案:

template<typename ... T>
constexpr bool multiComparision(const char scope, T ... args) {
    bool result = false;
    (void) std::initializer_list<int>{ 
        ((result = result || (scope == args)), 0)...
    };   
    return result;
}

live example on godbolt.org

答案 1 :(得分:1)

使用C ++ 11和C ++ 14时,将需要重载multiComparision

bool multiComparision(const char scope) {
   return false;
}

template <typename ... T>
bool multiComparision(const char scope, char arg1, T... args)  {
   return ( scope == arg1 || multiComparision(scope, args...));
}

查看它在https://ideone.com/Z3fTAI上的作用