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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值