可变函数模板基本情况:不带参数或带参数

Variadic function template base case: without parameters or with one?

本文关键字:参数 函数模板 基本情况      更新时间:2023-10-16

我想知道这些选项中的哪一个(如果有的话)是首选。

例如,我正在实现一个接受任意数量参数的sum函数。主模板是

template <typename T, typename... Ts>
auto sum(T t, Ts... ts)
{
    return t + sum(ts...);
}

对于基本情况,我可以看到至少两个选项:

  1. 基本情况是sum():

    auto sum() 
    { 
        return 0; 
    }
    
  2. 基本情况是sum(T):

    template <typename T>
    auto sum(T t)
    {
        return t;
    }
    

在这种情况下,这两种方式似乎都以相同的方式工作,但通常哪种方式更受欢迎呢?

第二种情况比引入int的选项1更通用。

即:使用第二个选项,您可以sum一些矩阵类,而第一个选项不允许这样做。(你应该通过const引用来获取参数,以便在矩阵情况下有效)。

通过引入int,您还可以在某些情况下获得不同的返回类型

auto res = sum('*');

选项1为int类型,选项2为char类型