[C++再学习系列] 模板函数的自定义点

来源:互联网 发布:易语言mysql多线程 编辑:程序博客网 时间:2024/06/07 10:11

模板函数:

在编写模板时,可以通过一些显示的自定义,对模板参数类型做一些必要的限制:

选择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++的名字查找规则促进有意的名字查找,并避免无意的名字查找。

 

原创粉丝点击