可以模板抽象类接口

Can abstract class interface be templated

本文关键字:抽象类 接口      更新时间:2023-10-16

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

  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 {};

编译器将生成2个不同类别的代码:MyClass<int>MyClass<double>。您本可以自己写信,那将是完全一样的!因此,实际上A normal 类和从模板生成的类之间没有区别。因此,对于问题,抽象类接口是否可以模板,答案是肯定的。请注意,尽管您将每种类型有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;
}