我尝试执行检查参数是否与特定值匹配的函数。
我认为知道如何使用递归或 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 也很有趣。
折叠表达式必须括在
(...)
:中return ((ts == value) || ... || (false));
。您也可以删除
|| false
,它对于||
折叠是隐式的。您可以通过替换
<typename T, T ...ts>
为例如来做到这一点<auto ...ts, typename T>
。但如果我是你,我会将所有替代方案作为函数参数传递(以允许它们在运行时更改)。
您只需要用括号将整个表达式括起来,如下所示:
工作演示
是的,您还可以使用占位符类型
auto
使其工作,而无需int
通过替换<typename T, T ...ts>
为显式指定<auto ...ts, typename T>
根据@HolyBlackCat的建议,这里是带有函数本身参数的版本。看起来很清晰并且摆脱了指定
<T>
.