可变参数函数模板基本情况:没有参数还是有参数?

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

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

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

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 一些矩阵 class,而第一个选项不允许这样做。 (不过,您应该通过 const 引用来论证,以便对矩阵情况有效)。

通过引入 int,在某些情况下您也有不同的 return 类型

auto res = sum('*');

这导致选项 1 的类型为 int,选项 2 的类型为 char