c++ - 如何正确地从嵌套结构派生?

标签 c++ templates polymorphism derived-class

我有一个抽象(模板化)类,我希望它有自己的返回类型 InferenceData .

template <typename StateType>
class Model {
public:
    struct InferenceData;
    virtual InferenceData inference () = 0;
};

下面是从中派生的尝试

template <typename StateType>
class MonteCarlo : public Model<StateType> {
public:
    
    // struct InferenceData {};
    
    typename MonteCarlo::InferenceData inference () {
        typename MonteCarlo::InferenceData x;
        return x;
    }
};

这有效,但只是因为 MonteCarlo::InferenceData 的定义被注释掉了。如果没有注释,我会收到无效协变返回类型错误。我想要每个ModelDerivation<StateType>::InferenceData 成为它自己的类型并拥有自己的结构实现。我如何实现这一目标?

最佳答案

您无法更改派生虚拟方法的返回类型。 这就是当您尝试从 MonteCarlo::inference() 返回派生的 InferenceData 时编译失败的原因。

为了实现您的需要,您需要使用多态返回类型,这需要指针/引用语义。 为此,您的派生 InferenceData 必须继承基 InferenceData,并且 inference() 应返回指向基 的指针/引用推理数据

一种方法是使用智能指针 - 例如一个std::unique_ptr - 请参阅下面的代码:

#include <memory>

template <typename StateType>
class Model {
public:
    struct InferenceData {};
    virtual std::unique_ptr<InferenceData> inference() = 0;
};


template <typename StateType>
class MonteCarlo : public Model<StateType> {
public:
    struct InferenceDataSpecific : public Model<StateType>::InferenceData {};

    virtual std::unique_ptr<Model::InferenceData> inference() {
        return std::make_unique<InferenceDataSpecific>();
    }
};

int main()
{
    MonteCarlo<int> m;
    auto d = m.inference();
    return 0;
}

注意:如果需要共享数据,可以使用std::shared_ptr .

关于c++ - 如何正确地从嵌套结构派生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72674420/

相关文章:

C++ 构造函数中不需要的隐式转换

templates - 如何在 MediaWiki 中隐藏侧边栏?

c++ - C++ 多态性中的访问冲突(虚拟指针函数指向错误的位置?)

php - 如何在 Laravel 中使用具有多态关系的 "group by"?

c# - 冒泡排序算法的空间复杂度

c++ - 寻找混合整数程序的绑定(bind)约束

c++ - 编译 Curl Visual Studio - 未解析的外部符号

类和子类中的 C++ 成员函数指针

c++ - C++ 中的静态多态性

c++如何定义不复制数据的强制转换运算符?