8

そうでない引数を無視するという条件で、可変数の引数を持つ合計関数を書きたいと思います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);
}
4

2 に答える 2

12

三項演算子がないので、constexpr代わりにラムダを使用できます。

#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);
}

Godbolt.org の実際の例

于 2018-12-14T17:28:10.533 に答える