如何在 c++ 中通过字符串实例化不同的子类?



以下是一些从抽象类派生的子类:

class obj
{
public:
virtual std::string type() = 0;
};
class subobj01 : public obj
{
public:
std::string type() override
{
return "subobj01";
}
};
class subobj02 : public obj
{
public:
std::string type() override
{
return "subobj02";
}
};
class subobj03 : public obj
{
public:
std::string type() override
{
return "subobj03";
}
};

现在我想定义一个执行以下操作的函数,

// pseudo-code
type create_instance(std::shared_ptr<obj> o)
{
if (o->type() == "subobj01")
return std::make_shared<subobj01>();
else if (o->type() == "subobj02")
return std::make_shared<subobj02>();
else if (o->type() == "subobj03")
return std::make_shared<subobj03>();
}

我不知道这是否可以使用模板元编程来实现。谢谢!


更新:我知道我可以使用std::dynamic_pointer_cast手动转换指针。

事实上,objsubobjxxx是由第三方库定义的(我不应该修改它们)。我只想实现一个包装器来自动执行指针转换,而无需手动指定类型。

您需要做的就是将返回类型中的type替换为std::shared_ptr<obj>,由于subobjXXobj继承,因此所有std::shared_ptr<subobjXX>都可以隐式转换为

。但是,您可以通过简单地声明create_instanceobj的纯虚拟成员函数并在每个子类中重写它以返回std::make_shared<subobjXX>()来避免整个字符串匹配工作。在CRTP的帮助下,甚至可以避免每个子类中的重复定义。

然后,您可以在类型为std::shared_ptr<obj>std::shared_ptr<subclassXX>的对象o上调用它(假设shared_ptr不为空),只需按o->create_instance()而不是create_instance(o)

最新更新