使用模板友元函數進行優雅的隱式類型轉換
處理模板類別時,啟用隱式類型轉換可能具有挑戰性。考慮類別模板 A 的建構子採用 int 和運算子重載進行加法:
template <unsigned int m> class A { public: A(int) {} }; template<unsigned int m> A<m> operator+(const A<m>&, const A<m>&) { return A<m>(0); }
通常,使用 int 呼叫建構子需要明確轉換。但是,以下範例會引發編譯錯誤:
A<3> a(4); A<3> b = a + 5; A<3> c = 5 + a;
精確類型匹配問題
問題在於模板函數的重載解析如何運作。在類型推導過程中,編譯器會尋找模板參數的精確匹配。在我們的例子中,它無法將 int 參數與建構函數匹配,因為類型不完全對齊。
解決方案:非成員友元函數
一個優雅的解決方案是在類別定義中定義一個非成員友元函數:
template <typename T> class test { friend test operator+(test const &, test const &) { return test(); } };
對於每個模板實例化,編譯器都會在命名空間層級產生一個具有適當簽名的單獨非模板函數:
test<int> operator+(test<int> const &, test<int> const &) { return test<int>(); }
非成員友元函數的優點
以上是如何透過模板友元函數實現優雅的隱式類型轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!