2015-07-20 30 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