使用友元運算子函數在模板中進行隱式型別轉換
要利用模板的隱式型別轉換,常用的技術是定義模板類別定義中的非成員友元函數。
在 C 中,模板函數在使用特定型別呼叫之前不會被實例化。在重載解析過程中,編譯器會推導出模板參數的類型,並消除任何與參數類型不完全匹配的模板,不包含隱式轉換。
解決方案在於利用模板內定義的友元運算子函數類別定義。對於每個模板實例化,編譯器都會產生一個免費的非模板函數,其簽名與替換類型相符。
例如,考慮:
template <typename T> class test { friend test operator+(test const &, test const &) { return test(); } };
當使用int 實例化模板時,編譯器建立一個非模板函數:
test<int> operator+(test<int> const &, test<int> const &) { return test<int>(); }
此函數可透過依賴參數的查找獲得,對其參數執行隱式轉換。這是因為它是在模板類別外部定義的,並且在重載決策期間不需要精確的類型匹配。
因此,在對 test
A<3> a(4); A<3> b = a + 5; A<3> c = 5 + a;
以上是友元運算子函數如何在 C 模板中啟用隱式類型轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!