gpt4 book ai didi

c++ - 如何在模板折叠表达式中使用 if constexpr?

转载 作者:可可西里 更新时间:2023-11-01 18:23:17 24 4
gpt4 key购买 nike

我想编写一个参数数量可变的求和函数,条件是它应该忽略不是 std::is_arithmetic

的参数

我找到了一个可行的递归版本

auto old_sum(){
return 0;
}

template<typename T1, typename... T>
auto old_sum(T1 s, T... ts){
if constexpr(std::is_arithmetic_v<T1>)
return s + old_sum(ts...);
else
return old_sum(ts...);
}

我想知道我是否可以在折叠表达式的上下文中使用 if constexpr 来使以下代码仅考虑参数包中的算术类型:

template<typename... T>
auto fold_sum(T... s){
return (... + s);
}

最佳答案

由于我们没有三元 constexpr 运算符,我们可以使用 lambda 代替。

#include <type_traits>

template<typename... T>
constexpr auto fold_sum(T... s){
return (... + [](auto x)
{
if constexpr(std::is_arithmetic_v<T>) return x;
else return 0;
}(s));
}

用法:

int main()
{
static_assert(fold_sum(0, nullptr, 5, nullptr, 11, nullptr) == 16);
}

live example on godbolt.org

关于c++ - 如何在模板折叠表达式中使用 if constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53784243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com