gpt4 book ai didi

c++ - 根据C++中的字符串值创建类对象实例的好方法?

转载 作者:行者123 更新时间:2023-12-02 09:47:49 26 4
gpt4 key购买 nike

有关问题,请参见代码片段:

class Base; 
typedef Base* BasePtr;

template<typename D>
BasePtr CreateDerivedClass() {
return new D();
}

class D1 : public Base {
....
};

class D2 : public Base {
....
}

void main() {
std::string derived_name = {"D1", "D2"};
std::vector<BasePtr> derived_vec;
for (auto& name : derived_name) {
// QUESTION: Other than factory design pattern, how can I pass the derived
// class typename which is the value of string "name" to CreateDerivedClass<name> ?
derived_vec.push_back(CreateDerivedClass<name>());
}
}
注意:在这里,我不想使用工厂设计模式,该模式在定义期间需要派生类注册本身。

最佳答案

模板参数值必须在编译时知道。没有简单的方法可以在运行时将字符串直接转换为可在模板参数中使用的类型。您将必须在运行时比较字符串值,以确定要调用的CreateDerivedClass特化名称。
例如,处理此问题的最简单方法是使用std::map,其中其元素包含指向您希望能够调用的专用函数的指针,例如:

using createFuncType = BasePtr (*)();
std::map<std::string, createFuncType> createFuncs;
createFuncs["D1"] = &CreateDerivedClass<D1>;
createFuncs["D2"] = &CreateDerivedClass<D2>;
...
然后,您可以执行以下操作:
std::string derived_names[] = {"D1", "D2"}; 
std::vector<BasePtr> derived_vec;
for (auto& name : derived_names) {
derived_vec.push_back(createFuncs[name]());
}
在这种情况下,确实没有其他选择。

话虽如此,您应该使用 std::unique_ptr<Base>而不是原始的 Base*指针,例如:
#include <map>
#include <vector>
#include <string>
#include <memory>

class Base {
public:
virtual ~Base() = default;
};

using BasePtr = std::unique_ptr<Base>;
using createFuncType = BasePtr (*)();

template<typename D>
BasePtr CreateDerivedClass() {
return std::make_unique<D>();
}

class D1 : public Base {
...
};

class D2 : public Base {
...
}

...

int main() {
std::map<std::string, createFuncType> createFuncs;
createFuncs["D1"] = &CreateDerivedClass<D1>;
createFuncs["D2"] = &CreateDerivedClass<D2>;
...

std::string derived_names = {"D1", "D2", ...};
std::vector<BasePtr> derived_vec;
for (auto& name : derived_names) {
derived_vec.push_back(createFuncs[name]());
}

...

return 0;
}

关于c++ - 根据C++中的字符串值创建类对象实例的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63834553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com