首页 > 解决方案 > 可变参数模板 - 递归函数 - 最后一个可变参数成员

问题描述

我有以下代码,其中包含从以下位置复制的可变参数模板: 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;
}

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

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

谢谢你

标签: c++variadic-templatestypetraits

解决方案


if constexpr为了补充@GuillaumeRacicot 的答案,我更喜欢用它来结束递归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;
}

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

template<typename ...Pack>
auto sum(Pack... args) {
    return (args + ...);
}

推荐阅读