天天看點

[C++再學習系列] 模闆函數的自定義點

在編寫模闆時 , 可以通過一些顯示的自定義 , 對模闆參數類型做一些必要的限制 :

選擇 1: 模闆直接依賴于類型具有給定名字的合适的成員函數 , 則顯式要求參數T提供該成員函數 .

選擇 2: 模闆依賴于 ” 類型具有給定名字的合适的非成員函數 ”, 則顯式的要求T 具有給定名字 / 簽名和語義的非成員函數 .

選擇 3: 模闆依賴于 ” 類型已經特化 ( 如果必要 ) 另一個模闆 ”, 則需要被特化的模闆提供一個 ( 通常是靜态類成員 ) 具有給定名字 / 簽名和語義的函數 .

Template<typename T>

Void Sample1(T t){

t.foo();       // 選擇 1, foo() 是 T 的成員函數 .

foo(t);        // 選擇 2, foo() 是和類型 T 一起提供的非成員函數 ( 屬于同一個名字空間 )

S3Traits<T>::foo(t);  // 選擇 3, foo() 是靜态類成員

}

選擇 1 将模闆中的任何輔助函數都放在其自己内嵌的名字空間中 (名字空間包括名字空間 + 類名 (靜态函數))

選擇 2 在引用基類的任何成員函數時 , 顯式的使用基類名或者 this-> 進行限定 .

class X<T>{

public:

void f()

{

X<T>::baz();   // 通過類名進行限定

T::baz();          // 通過類名進行限定

This->baz();    //this 指針

Hepler::baz();   // 這裡 hepler 可以是名字空間 , 也可以是類名

      }

       為模闆函數提供顯式的自定義點,或避免無意的自定義點,其本質都是 C++ 名字查找規則,就是利用 C++ 的名字查找規則促進有意的名字查找,并避免無意的名字查找。

---------------------------------------------------

歡迎轉載,請注明作者和出處

本文轉自 zhenjing 部落格園部落格,原文連結:http://www.cnblogs.com/zhenjing/archive/2011/01/24/template_function.html   ,如需轉載請自行聯系原作者

繼續閱讀