首页 > 解决方案 > 在模板类型名上调用自定义构造函数

问题描述

假设我有以下代码:

Class A
{
public:
    A(B* b)
      : m_B(*b)
    {}

    //Default constructor won't work as it needs to initialize "m_B"
    
private:
    B& m_B;
};

然后我有一个B类:

class B
{
public:
    //check that typename is a derivative of A
    template<typename T>
    AddInstance()
    {
        T* instance = new T(this);
        m_Instances.emplace_back(instance);
    }

private:
    std::vector<A*> m_Instances;
};

在这种情况下,我必须AddInstance使用可以初始化的构造函数来构造 A 类m_B。然而,当我这样做时(并且我使用以下概念确保 typename 从 A 派生 template<typename T> concept Derivative = std::is_base_of<A, T>::value;:)除了默认构造函数之外,我无法初始化 typename 变量。如果我确定 typename 继承自 A,有没有办法通过重载的构造函数对其进行初始化?

注意:在我的项目中,类 A 将是一个抽象类,因此类型名将是 A 的专门派生词,我将其放入向量中

编辑 所以我想出了我的问题。我假设继承类能够从其基类调用构造函数。相反,派生类需要创建自己的构造函数来初始化其基类。我对我的项目的整个想法是,一个人应该尽可能少地创建一个新的派生类,所以我正在尝试做这样的事情:

AddInstance<Specialization>();

//In AddInstance:
{
    A* instance = new A(this);
    m_Instances.emplace_back(static_cast<Specialization*>(instance));
}

所以假设我应该能够用 A 的构造函数构造一个新类,然后将其转换为所需的专业化。虽然当我实际这样做时,我只是执行 A 的方法而不是专业化的覆盖

标签: c++templatesconstructorpolymorphismconstructor-overloading

解决方案


推荐阅读