我尝试执行检查参数是否与特定值匹配的函数。
我认为知道如何使用递归或 std::initializer_list 来做到这一点,但我想用折叠来做到这一点。这是非工作代码:
template<typename T, T ...ts>
constexpr bool is_in(T value){
return (ts == value) || ... || (false);
}
int main(){
if constexpr(is_in<int, 1, 2, 3>(1))
return 10;
}
此外,如果可能的话,我想摆脱指定类型(例如
<int>
)
想要 C++17 中的解决方案,但 C++20 也很有趣。
您只需要用括号将整个表达式括起来,如下所示:
template<typename T, T ...ts>
constexpr bool is_in(T value){
//---------v-------------------------------v--->added parnthesis
return ((ts == value) || ... || (false));
}
折叠表达式必须括在
(...)
中:return ((ts == value) || ... || (false));
。
您也可以删除
|| false
,它对于 ||
折叠是隐含的。
此外,如果可能的话,我想摆脱指定类型(例如
)<int>
您可以通过将
<typename T, T ...ts>
替换为例如<auto ...ts, typename T>
。
但如果我是你,我会将所有替代方案作为函数参数传递(以允许它们在运行时更改)。