有效的可变参数等于任何函数

时间:2019-08-18 18:28:39

标签: c++ algorithm c++17 variadic-templates

我想创建一个返回第一个参数是否等于其他任何参数的函数。这是我想出的:

template<typename T, typename... U>
bool equalsAny(T first, U... args) {
    U arr[] {args...};
    for (auto& arg : arr) if (first == arg) return true;
    return false;
}

在必须为所有参数创建数组的意义上,这当然很慢。例如通过使用c ++ 17折叠表达式,有什么方法可以使速度几乎与first == arg1 || first == arg2 || ...一样快?

1 个答案:

答案 0 :(得分:3)

您标记了C ++ 17,所以...模板折叠有什么问题?

template <typename T, typename... U>
bool equalsAny (T first, U... args)
 { return (first == args || ...); }

在C ++ 17之前的版本中,您可以使用未使用的C样式数组的初始化(我不是专家,但我想一个好的编译器可以很好地对其进行优化)

template <typename T, typename... U>
bool equalsAny (T first, U... args)
 { 
   using unused = bool[];

   bool ret { false };

   (void)unused { false, (ret = ret || (first == args))... };

   return ret;
}