2015-07-20 51 views
4

我想知道这些(如果有的话)中的哪一个将是首选。变量函数模板基础案例:不带参数或带有一个?

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

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

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

  1. 基例是总和():

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

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

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

+2

我认为第二种情况是更好因为第一个添加一个没有参数的操作 –

+0

尝试两者并测量。您可能会发现,优化后他们最终会得到相同的程序集。 – TartanLlama

+3

我会使用第一个,因为有一天您可能会在其他代码中实际使用零参数的版本。 – Petr

回答

4

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

ie:与第二个选项,你可以sum某些矩阵类,而第一个不允许的。 (你应该通过const引用使参数对矩阵的情况有效)。

通过引入int,你也有一些情况下,不同的返回类型

auto res = sum('*'); 

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

+0

*更通用*建议只有这一个标准。但是至少有另一个,正如Petr指出的那样:'sum(t ...)'是否适用于'sizeof ...(t)== 0'。 (但是它仍然是一个有效的问题,'sum()'应该有什么类型。) – dyp