[C++再学习系列] 模板函数的自定义点
2009-07-30 21:17
281 查看
模板函数
:
在编写模板时
,
可以通过一些显示的自定义
,
对模板参数类型做一些必要的限制
:
选择
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++
名字查找规则,就是利用
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->
进行限定
.
Template<typename T>
class X<T>{
public:
void f()
{
X<T>::baz(); //
通过类名进行限定
T::baz(); //
通过类名进行限定
This->baz(); //this
指针
Hepler::baz(); //
这里
hepler
可以是名字空间
,
也可以是类名
}
}
为模板函数提供显式的自定义点,或避免无意的自定义点,其本质都是
C++
名字查找规则,就是利用
C++
的名字查找规则促进有意的名字查找,并避免无意的名字查找。
相关文章推荐
- [C++再学习系列] 模板函数的自定义点
- 总结系列_4(C++知识学习,续...)
- [C++再学习系列] 函数模板和类模板
- [C++再学习系列] 派生类函数的重实现规则(override-覆盖)
- Gradle学习系列之九——自定义Task类型
- opencv学习系列:视频读取及自定义视频类处理
- Gradle学习系列之九——自定义Task类型
- [C++再学习系列] 析构函数不能失败的理由
- [C++再学习系列] STL容器删除操作总结
- <<C++ design patterns and Derivatives Pricing>> 学习系列 CH1-对蒙特卡洛基本理解
- C++学习笔记(第七章 自定义数据类型 结构体应用 之三)
- [C++再学习系列] 函数声明与STL容器构造
- [C++再学习系列] ADL(Koenig)查找
- C++基础学习系列第一部分——再议数组与指针
- Android学习系列(3)--App自动更新之自定义进度视图和内部存储
- c++学习总结系列--序言
- c/c++学习系列之putchar、getchar、puts、gets的运用
- C++基础学习笔记:自定义数组模板类
- Gradle学习系列之九——自定义Task类型
- C++再学习系列:使用合理的引用参数实现接口的自说明