如何在模板折叠表达式中使用constexpr?

mot*_*m79 7 c++ template-meta-programming variadic-templates fold-expression c++17

我想写一个带有可变参数的sum函数,条件是它应该忽略不是的参数 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...);
}
Run Code Online (Sandbox Code Playgroud)

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

template<typename... T>
auto fold_sum(T... s){
    return (... + s);
}
Run Code Online (Sandbox Code Playgroud)

Vit*_*meo 9

由于我们没有三元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));
}
Run Code Online (Sandbox Code Playgroud)

用法:

int main()
{
    static_assert(fold_sum(0, nullptr, 5, nullptr, 11, nullptr) == 16);
}
Run Code Online (Sandbox Code Playgroud)

godbolt.org上的实例

  • 如果你给lambda命名会更容易阅读;-) (3认同)