C++模板----限制模板只能某些已知类型进⾏实例化
编译器遇到模板定义时会进⾏语法检查,但不进⾏编译,当编译器遇到遇到⼀个实例化
的模板时,才会编译出对应实例化类型的实例化代码,进⽽⽣成⽬标⽂件,供我们链接
程序时使⽤,这似乎说明如果我们只是定义了模板,⽽没有使⽤,那么到最后我们的⽬
标⽂件中是不到模板的踪影的,我们也就是抓住模板的这个特性,在实现模板⽅法的
源⽂件中添加模板的对应类型的显⽰实例化,那么最后这个源⽂件也将只包含我们实例
化后对应模板类的定义,如果某个类型我们没有在这个源⽂件中对其进⾏显⽰实例化,
我们这个源⽂件⽣成的⽬标⽂件中将不会包含这个未实例化模板的类的定义,如果我们
在其他⽂件中尝试模板去实例化新的类型,将会出现连接错误。
template<typename Parent>
class FrameInternal :public Parent{
cacheable
public:
typedef std::shared_ptr<FrameInternal> Ptr;
FrameInternal(const Frame::Ptr &parent_frame,char*ptr, size_t size, size_t prefix_size)
:Parent(ptr, size, parent_frame->dts(), parent_frame->pts(), prefix_size){
_parent_frame = parent_frame;
}
bool cacheAble()const override {
return _parent_frame->cacheAble();
}
private:
Frame::Ptr _parent_frame;
};
上⾯这个例⼦就是限制Parent的类型,只能有Parent(ptr, size, parent_frame->dts(), parent_frame->pts(), prefix_size) 参数的类去作为模板Parent,其余的都不⾏,其余的在编译的时候就奔溃报错了。
⾄于第⼆个问题,什么时候这样⽤,⾃⼰去想。
如果不限制类型的话,可以看下⾯
template<typename Parent,typename Delegate>
class PlayerImp : public Parent {
public:
typedef std::shared_ptr<PlayerImp> Ptr;
//采⽤完美转发
template<typename ...ArgsType>
PlayerImp(ArgsType &&...args):Parent(std::forward<ArgsType>(args)...){}
virtual ~PlayerImp(){}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论