2011-10-11 48 views
3

我正在C++中訓練我的模板技巧,並且想實現一個向量類。 該類由矢量維N和類型T定義。 現在我想要一個構造函數,它只需要T類型的N個變量。 但是,我無法理解如何將可變參數模板告訴給只接受N個參數。也許這是可能的模板專業化? 或者我在錯誤的方向思考? 任何想法/想法,將不勝感激。C++模板variadic但是靜態的

更多的想法

我已經看到用遞歸「迭代」通過參數列表可變參數模板的例子。不過,我記得 構造函數不能從構造函數 中調用(請閱讀答案中的註釋)。所以也許它甚至不可能在構造函數中使用可變參數模板?無論如何,這隻會推遲到使用具有相同基本問題的工廠功能。

+0

嗯,我認爲Luc Danton在編輯之前已經回答了,所以它是從哪裏來的? – Griwes

+0

@格里斯:是的,你說'它從哪裏來的'是什麼意思? – Nobody

+0

我的意思是你的編輯;) – Griwes

回答

8

一個可變參數的構造函數似乎是恰當的:

template<typename T, int Size> 
struct vector { 
    template<typename... U> 
    explicit 
    vector(U&&... u) 
     : data {{ std::forward<U>(u)... }} 
    { 
     static_assert(sizeof...(U) == Size, "Wrong number of arguments provided"); 
    } 

    T data[Size]; 
}; 

本例使用完美轉發,並static_assert即使不完全Size參數傳遞給構造函數產生一個硬錯誤。這可以調整:

  • 您可以通過使用std::enable_if(觸發SFINAE)將硬錯誤變成軟錯誤;我不會推薦它
  • 你可以改變的條件是sizeof...(U) <= Size,讓剩餘的元素是值初始化
  • 可以要求傳遞給構造函數的類型轉換爲T,或完全匹配例如T const&;或者將違規轉化爲硬錯誤(再次使用static_assert)或軟錯誤(再次使用SFINAE)
+0

爲什麼'U'而不是'T'? (出於興趣)... – Nim

+0

非常好,我沒有想到通過列表初始化。這解決了遞歸問題,如果有的話。那麼有沒有一個? ^^ @Nim:他已經將T用於另一種類型,所以將它的後繼作爲下一個類型名稱是唯一的邏輯。 – Nobody

+0

@Nim'U'是構造函數的模板參數(它是模板的成員模板)。使用'T'意味着隱藏'vector'的模板參數並且不被允許。 –