前置声明以及在 Callback 实现中的应用

Code First:

template <typename Sig>
class Callback;

template <typename R>
class Callback<R(void)> : public internal::CallbackBase {
};

PS: 摘自 chromium 中的实现。

Callback 是对函数的封装,所以要完成的需求是,模板类的一个类型为函数类型,实例化出来一个该函数类型的函数对象类;

1. 这里前面部分写了一个前置声明的模板类 Callback,它会告诉编译器,Callback 是个模板类,这样 Callback<R(void)> 就属于一个合法的模板类实例了;

2. 当传入不同函数类型去实例化类时,就可以写多个 Callback<R(X,Y,Z)> 这样的模板类,去匹配不同的函数对象类了;

3. 前面部分还限定了 Callback 类是一个只接受一个类型的模板类,且它未实现,即,如果随便传一个类型去实例化 Callback,将找不到相应的类模板,再配合多个类型的模板类,就做到了只能传函数类型进来,才会被正常实例化。

4. 推理可知,编译器在编译模板类时,类名可以是个不完整类型,且匹配类型时会按照最符合类型的模板去实例化。


这就是模板的偏特化技术。

编译器的编译这类模板时, 前置声明的 Callback 是对该模板类的声明,表明它是一个模板类,且有几个模板参数;后面的模板类都是该模板类的偏特化实现,有点类似于函数重载,当实例化时,找到最匹配实现,再反推自己的模板类参数,即 R,然后实现实例化。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值