gpt4 book ai didi

java - 从类类型实例化 C++ 中的类作为 std::map 值

转载 作者:太空宇宙 更新时间:2023-11-04 15:06:10 27 4
gpt4 key购买 nike

我需要将以下 Java 概念移植到 C++ 中:

包含对象 ID 键和类类型值的 HashMap :

 Map<String, Class> _objectsBank = new HashMap<>();

在 init 方法的某个地方,我像这样填充银行:

    _objectsBank .put("CLASS_ID_1", MyClass1.class);
_objectsBank .put("CLASS_ID_2", MyClass2.class);
....

然后,稍后,我根据需要构造了一个保存在该银行中的类的实例。有点“懒惰”的初始化:

 private MyClass initNewProg(String name) {

MyClass instance;


try {

Class cl = _objectsBank.get(name);
java.lang.reflect.Constructor co = cl.getConstructor(String.class);
instance= (MyClass) co.newInstance(name);
return instance;

} catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e)
{
e.printStackTrace();
return null;
}
}

我将如何在 C++ 中执行此操作?如何将类类型设置为 std::map 值,以便稍后查询它以从中构造适当的实例?Boost库中有类似的东西吗?

最佳答案

您可以使用函数指针。由于您不能将函数指针指向构造函数,因此您必须使用工厂函数:

template <class Derived>
Base* create()
{
return new Derived;
}

然后您可以将函数指针保存到映射中工厂函数的模板实例以构造您的派生类:

int main()
{
std::map<std::string, Base*(*)()> classMap;
classMap["Derived1"] = &create<Derived1>;
classMap["Derived2"] = &create<Derived2>;

delete classMap["Derived1"]();
delete classMap["Derived2"]();
}

查看 Ideone

关于java - 从类类型实例化 C++ 中的类作为 std::map 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14548313/

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