欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++模板----限制模板只能某些已知类型进行实例化

程序员文章站 2022-07-02 08:30:50
...

编译器遇到模板定义时会进行语法检查,但不进行编译,当编译器遇到遇到一个实例化
的模板时,才会编译出对应实例化类型的实例化代码,进而生成目标文件,供我们链接
程序时使用,这似乎说明如果我们只是定义了模板,而没有使用,那么到最后我们的目
标文件中是找不到模板的踪影的,我们也就是抓住模板的这个特性,在实现模板方法的
源文件中添加模板的对应类型的显示实例化,那么最后这个源文件也将只包含我们实例
化后对应模板类的定义,如果某个类型我们没有在这个源文件中对其进行显示实例化,
我们这个源文件生成的目标文件中将不会包含这个未实例化模板的类的定义,如果我们
在其他文件中尝试模板去实例化新的类型,将会出现连接错误。

template<typename Parent>
class FrameInternal : public Parent{
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(){}
}
相关标签: 音视频资料