gpt4 book ai didi

C++ 将字符串映射到对象

转载 作者:行者123 更新时间:2023-11-30 01:39:05 24 4
gpt4 key购买 nike

我正在尝试创建一个可以将字符串映射到某些任意对象甚至原始类型的类。澄清一下,我不是在谈论一种单一的泛型类型,而是不同的类型,所以 map 可能看起来像这样: ["speed": 3, "useNormal": false, "normal": Vec3()]

我尝试过的一种方法是创建一个 BaseObject构造和派生其他类,如 IntObjectFloatObject从中。这样我就能够创建一个 std::map<std::string, BaseObject*> .但是这种方法感觉很笨拙, map 的 getter 和 setter 需要为每种类型都有一个 switch case。

有人建议使用字节。基本上这意味着将对象序列化和反序列化为字节数组,因此映射看起来像这样 std::map<std::string, byte*> .但是使用这种方法要克服的一大障碍是以某种方式从字节数组生成特定类型的对象,我不知道该怎么做。

另一个建议也是使用 c++17 变体。但这太新了,无法得到广泛支持。

我将不胜感激任何类型的输入!

最佳答案

普遍认为std::map<std::string, std::any>>将是最好的解决方案。但是因为我试图避免 boost 和 c++17,这里是一个纯 c++ 实现,一个面向对象的方法来解决这个问题:

struct SuperObject {};

template<class T>
struct BaseObject: SuperObject {
T _value;
BaseObject(T value) : _value(value) {}
};

std::unordered_map<std::string, SuperObject*> objectMap;


template<typename T>
void setValue(std::string name, T value) {
objectMap[name] = new BaseObject<T>(value);
}

template <typename T>
T getValue(const std::string& name) {
return ((BaseObject<T>*)(objectMap[name]))->_value;
}

调用setValue()时请注意巨大的内存泄漏

关于C++ 将字符串映射到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46513758/

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