繁体   English   中英

可以对抽象类接口进行模板化

[英]Can abstract class interface be templated

可以对抽象类接口进行模板化吗?我们可以在派生类中使用模板来填充参数吗? 如何为这些类型的需求定义接口参数

  class iconfigurator
    {
    public:
        iconfigurator();
        virtual ~iconfigurator();
        //EXpect the std::vector<class entry>& entries to be Template type.              
        virtual bool config(const std::string& configName,std::vector<class entry>& entries) const = 0;    
    };

    class derivedconfigurator : public iconfigurator
    {        
    public:
        derivedconfigurator();
        virtual ~derivedconfigurator();    
        virtual bool config(const std::string& configName,std::vector<class another_entry_type>& entries) const = 0;    
    }

    class derivedconfigurator2 : public iconfigurator
    {    
    public:
        derivedconfigurator2();
        virtual ~derivedconfigurator2();    
        virtual bool config(const std::string& configName,std::maps<key, value>& entries) const = 0;
    }

模板只是编写N个函数或类的快捷方式。

template <typename T> class MyClass {}
MyClass<int> mc1 {};
MyClass<int> mc2 {};

编译器将为两个不同的类生成代码: MyClass<int>MyClass<double> 您可以自己编写它们,那将是完全一样的! 因此, 普通类和从模板生成的类之间实际上没有区别。 因此,对于可以将抽象类接口进行模板化的问题,答案是肯定的。 请注意,尽管如上所述,每种类型您将有1个抽象接口(只是想像您已经编写了MyClass的两个定义)。 当然,您也可以在派生类中使用模板。

您不能做的是使用模板化虚函数。 为什么? 模板在编译时生成代码。 虚函数是关于在运行时确定要调用哪个函数。 因此,由于要在运行时确定要调用的函数,因此编译器无法知道要生成的代码。

模板化抽象接口的示例:

template <typename T>
struct Base
{
    virtual ~Base() = default;

    // YOU CAN DO THIS
    virtual void test() const = 0;

    // BUT YOU CANNOT DO THIS
    /*template <typename D>
    virtual void fct();*/ 

};

template <typename T>
struct Derived : Base<T>
{
    void test() const override {}
};

int main()
{
    Base<int>* b = new Derived<int>();
    b->test();
    delete b;
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM