高效可变参数等于任何函数
Efficient variadic equals-any function
我想创建一个函数,returns 第一个参数是否等于其他参数。这是我想出的:
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;
}
从必须为所有参数创建数组的意义上讲,这当然非常慢。有什么方法可以使它几乎与 first == arg1 || first == arg2 || ...
一样快,例如使用 c++17 折叠表达式?
你标记了 C++17 所以...模板折叠有什么问题?
template <typename T, typename... U>
bool equalsAny (T first, U... args)
{ return (first == args || ...); }
Pre 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;
}
我想创建一个函数,returns 第一个参数是否等于其他参数。这是我想出的:
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;
}
从必须为所有参数创建数组的意义上讲,这当然非常慢。有什么方法可以使它几乎与 first == arg1 || first == arg2 || ...
一样快,例如使用 c++17 折叠表达式?
你标记了 C++17 所以...模板折叠有什么问题?
template <typename T, typename... U>
bool equalsAny (T first, U... args)
{ return (first == args || ...); }
Pre 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;
}