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

标签 c++ c++17 variadic-templates template-meta-programming fold-expression

我想编写一个参数数量可变的求和函数,条件是它应该忽略不是 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/

相关文章:

c++ - Clang 可变参数模板特化错误 : non-deducible template parameter

c++ - 如何有效地实现将 vector 的数据分配给多个变量?

c++ - boost any_range 性能:std::prev(iterator) 与 --iterator

c++ - 如何在 C++ 中传递带有 '&' 标志的参数

c++ - g++ 警告 : conversion to uint16_t from int may alter its value

c++ - 我可以将 braced-init-list 用于 std::variant 的 vector 吗?

c++ - 从临时成员中删除成员时省略复制/移动

c++ - 记事本中的 Turbo C 数据库

c++ - C++17 中的 std::back_insert_iterator

c++ - 为什么通过通用引用运算符 (&&) 将变量引用传递给可变参数模板函数失败?