【问题标题】:How to invoke the constructor of a class in C++ template?如何在 C++ 模板中调用类的构造函数?
【发布时间】:2020-09-10 15:05:46
【问题描述】:

考虑一个 C++ 模板类(mixin 类),它继承自模板上声明的同一个类,即,

template <class Model>
class Mixin : public Model {
  ...
}

动机是重用这个Mixin 来为不同的Model 类扩展方法。例如,对于模型类ModelOne,

class ModelOne {
public: 
    ModelOne (int a, int b) { ... }
}

被Mixin 类“修饰”并进一步扩展为

class Realization : public Mixin<ModelOne> {
...
}

如何在Realization 类中显式调用ModelOne 类的构造函数?不同的模型类可能有不同的构造函数签名。

【问题讨论】:

    标签: c++ templates inheritance constructor


    【解决方案1】:

    Realization 派生自Mixin&lt;ModelOne&gt;,所以它需要为Mixin&lt;ModelOne&gt; 调用构造函数,而不是直接为ModelOne 调用构造函数。然后Mixin 的构造函数可以调用其Model 的构造函数。但是如果Mixin 不知道Model 构造函数需要哪些参数,那么Mixin 将不得不使用可变参数模板参数来传递所有指定的参数值,例如:

    template<typename... T>
    struct Mixin : T...
    {
        Mixin() = delete;
        Mixin(Mixin const &) = delete;
        Mixin(Mixin &&) = delete;
    
        template<typename... U>
        Mixin(U&&... v) : T(std::forward<U>(v))... { }
    };
    
    class ModelOne
    {
    public:
        ModelOne (int a, int b) { ... }
    };
    
    class Realization : public Mixin<ModelOne>
    {
    ...
    public:
        Realization() : Mixin<ModelOne>(1, 2) {} 
    }
    

    另见:Constructing a mixin based on variadic templates by forwarding constructor parameters

    【讨论】:

    • 有趣的答案。我认为“可变参数模板参数”满足了这里的需求。
    • 然而,编译器一直在抱怨error: mismatched argument pack lengths while expanding ‘T’ Mixin(U &amp;&amp;... v) : T(std::forward &lt;U&gt;(v))... {}。这个错误在g++-5和g++-7都出现,可能与编译器版本无关。
    • @Xavier 我的可变参数模板功夫不太好,所以我确信这只是调整语法以使其工作的问题。
    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 2019-03-14
    • 2017-08-27
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多