通过布尔运算扩展参数包

问题描述 投票:0回答:2

我尝试执行检查参数是否与特定值匹配的函数。

我认为知道如何使用递归或 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 也很有趣。

c++ c++17 variadic-functions
2个回答
1
投票

您只需要用括号将整个表达式括起来,如下所示:

template<typename T, T ...ts>
constexpr bool is_in(T value){
//---------v-------------------------------v--->added parnthesis 
    return ((ts == value) || ... || (false));
}

工作演示


0
投票

折叠表达式必须括在

(...)
中:
return ((ts == value) || ... || (false));

您也可以删除

|| false
,它对于
||
折叠是隐含的。

此外,如果可能的话,我想摆脱指定类型(例如

<int>

您可以通过将

<typename T, T ...ts>
替换为例如
<auto ...ts, typename T>

但如果我是你,我会将所有替代方案作为函数参数传递(以允许它们在运行时更改)。

© www.soinside.com 2019 - 2024. All rights reserved.