模板函数
:
在编写模板时
,
可以通过一些显示的自定义
,
对模板参数类型做一些必要的限制
:
选择
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->
进行限定
.
Template<typename T>
class X<T>{
public:
void f()
{
X<T>::baz(); //
通过类名进行限定
T::baz(); //
通过类名进行限定
This->baz(); //this
指针
Hepler::baz(); //
这里
hepler
可以是名字空间
,
也可以是类名
}
}
为模板函数提供显式的自定义点,或避免无意的自定义点,其本质都是
C++(www.cppentry.com)
名字查找规则,就是利用
C++(www.cppentry.com)
的名字查找规则促进有意的名字查找,并避免无意的名字查找。