在編寫模闆時 , 可以通過一些顯示的自定義 , 對模闆參數類型做一些必要的限制 :
選擇 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 ,如需轉載請自行聯系原作者