我有一個模板函數的對象轉換爲字符串的向量(這是從圖書館,我無法改變這一點):專營模板任意類型
template <typename Q> std::wstring ToString(const Q& q) { static_assert(false, "Must specialise"); }
現在,我要打電話它的參數爲std::vector<Gene>
,其中Gene
是一個簡單的類,其細節不重要。當然,要做到這一點,我需要專門的模板,所以我做的:
template<> std::wstring ToString(const std::vector<Gene>& q){...}
假設我有另一個類,Cell
,我想專門爲std::vector<Cell>
的ToString
功能。我將不得不做出另一個明確的專業化,與std::vector<Gene>
版本一樣。
用於將std::vector
不依賴於實際的內容類型(int類型,一個Gene
,一個Cell
,另一std::vector
等),所以這將是有意義的創建一個模板專業化,可與任何工作的邏輯std::vector
。但我無法想出一個簡單的方法來做到這一點。目前,我目前有一個VectorToString
函數,並轉發來自ToString(std::vector<Gene>>)
和ToString(std::vector<Cell>)
的呼叫,但這仍然要求我爲每個元素類型實現專門化。
所以,對於實際的問題:是否有可能爲任意的std::vector
創建一個專業化,我將如何做到這一點?而且,作爲獎勵問題,這可以推廣到任何支持std::begin
和std::end
的任意集合嗎?
我已經看過這個this question,並試圖宣稱這樣的專業化:
template<typename E> std::wstring ToString<std::vector<E>>(const std::vector<E>& t){...}
但這種失敗C2768:非法使用顯式模板參數(「編譯器無法確定是否一個函數定義爲應該是一個函數模板的明確的專門化,或者如果函數定義應該是爲了一個新的函數。「),這是有道理的,因爲我們有相同的函數名稱和模板參數的數量,以及類似的簽名。
僅供參考,我使用的是Visual C++ 2015 RC,原始模板函數來自原生測試庫。
不幸的是,您不能部分專門化功能,您正在_overloading_它們。 – grisha