在 C 中,在類別構造函數中初始化物件時如何調用明確模板構造函數?考慮以下範例:
struct T { template<class> T(); }; struct U { U() : t<void>() {} // This approach does not work T t; };
提供的程式碼嘗試在 U 的初始值設定項清單中明確呼叫 T 的範本建構子。但是,此方法失敗。
C 中不支援明確呼叫初始值設定項清單中的範本建構子。此限制源於這樣一個事實:模板參數通常是在函數模板名稱之後使用尖括號指定的。由於建構函式沒有自己的名稱,因此沒有傳統的方法可以將模板參數傳遞給它們。
C 標準在第14.8.1/7 節中明確指出了此限制:
[Note: because the explicit template argument list follows the function template name, and because conversion member function templates and constructor member function templates are called without using a function name, there is no way to provide an explicit template argument list for these function templates. ]
一種解決方法方法是利用輔助型別將模板參數傳遞為接受型別標識的建構子的參數。例如:
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
在這種情況下,Boost 中定義的身份模板可以用來包裝模板參數。或者,在 C 20 中,可以使用 std::type_identity 類型。
以上是如何在 C 初始化列表中明確呼叫模板建構函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!