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

Efficient variadic equals-any function

本文关键字:于任何 函数 参数 变参 高效      更新时间:2023-10-16

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

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 || ...一样快?

你标记了 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;
}