可变参数模板-递归函数-最后一个可变参数成员

Nuj*_*fas 4 c++ type-traits variadic-templates

我有以下代码,以及从以下站点复制的可变参数模板:https : //www.youtube.com/watch?v= iWvcoIKSaoc @ 41:30

auto sum() { return 0; }

template<typename Head, typename... Tail>
auto sum(Head head, Tail... tail)
{
    return head+sum(tail...);
}

int main() {
    cout<< sum(1,2.4) << endl;
    //cout<< sum("hello ", "world") << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:1.这里需要sum()函数,这样我才能为处理最后一个可变参数成员时传入的void提供一个返回值-是否可以避免编写此sum()函数并且具有相同的值功能?

  1. 从sum()函数返回整数'0'会限制整个模板使用整数-我可以扩展同一模板来连接字符串吗?

谢谢

Kos*_*Rim 6

为了补充@GuillaumeRacicot答案,我宁愿结束与递归if constexpr这是一个c++17特点。

template<typename Head, typename Second, typename... Tail>
auto sum(Head head, Second second, Tail... tail)
{ 
    if constexpr(sizeof...(tail) > 0)
      return head + sum(second, tail...);
    return head + second;
}
Run Code Online (Sandbox Code Playgroud)

您还可以考虑折叠表达式:

template<typename ...Pack>
auto sum(Pack... args) {
    return (args + ...);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是C ++ 17,则不妨使用[折叠表达式](https://godbolt.org/z/GLJwEn)... (2认同)