C++ 运行时多态性或模板类型选择

问题描述 投票:0回答:1

我有一个要读取的二进制文件,在该文件中,存储数据的数据类型在开头被编码为数字。因此,我需要在运行时读取文件时,创建具有指定类型的类的对象并将数据存储在其中。
我遇到的问题是,对于模板,需要在编译时知道类型,但事实并非如此。不过,我确实知道可能的类型是什么,因此它不需要完全通用(比方说 int 和 float)。
我的另一种方法是使用像这样的多态性

#include<iostream>
using namespace std;

struct Parent {
    virtual void get_type();
};

template<class T>
struct Child : public Parent{
    // T data;

    void get_type() {
        cout << typeid(T).name() << endl;
    }

    // T& get_data() {
    //     return data;
    // }
};

Parent* Factory(int in) {
    if (in == 0) {
        return new Child<int>;
    } else {
        return new Child<float>;
    }
}


int main() {
    int in;
    cin >> in;

    Parent* p = Factory(in);
    
    p->get_type();
    delete p;
}

但是,当前注释掉的部分将不起作用,因为它需要是不知道 T 的 Parent 的虚拟函数。
另一种解决方案是在 if 语句内创建对象。然而,我确实需要它的寿命比它的范围更长。 我也研究过 std::variant 但这对于我的需求来说似乎太复杂了。

我想知道是否有一种(简单)方法可以使用从两到五种类型的列表中选择的运行时数据类型来创建对象/类,这仍然允许我使用标准 getter 和访问类中的数据设置方法。

c++ templates polymorphism
1个回答
0
投票

我认为你的约束是不可满足的:你想要“使用标准的getter和setter方法访问类中的数据”,甚至不知道其类型,但是

std::variant
“对于我的需求来说似乎太复杂”。

© www.soinside.com 2019 - 2024. All rights reserved.