我正在使用一个使用底层 map 的类。当我在类中使用下标运算符时,我看到底层映射的值被覆盖。我做错了什么?
class JsonMap {
public:
ObjAndType& operator[](const string index) {
return objectMap[index];
}
private:
map<string, ObjAndType> objectMap;
};
template<typename T>
ObjAndType serialize(T data) {
ObjAndType obj;
obj.type = typeid(T).name();
obj.obj = static_cast<void*>(&data);
return obj;
}
JsonMap jsonMap;
string s1 = "firstVal", s2 = "secondVal";
jsonMap["first"] = serialize(s1);
jsonMap["second"] = serialize(s2);
cout << "printing " << *reinterpret_cast<string*>(jsonMap["first"].obj) << endl;
// prints secondVal instead of firstVal
最佳答案
obj.obj = static_cast<void*>(&data);
data
是一个局部变量。你不能像这样保存它的地址,因为data
的生命周期在函数返回时结束。 &data
仅在函数执行期间有效。
如果您想在变量中存储任意类型的值,请使用 std::any
(自 C++17 起)。它保存一个值及其类型,就像您尝试对 ObjAndType
类执行的操作一样。
std::map<std::string, std::any> objectMap;
关于c++ - map 包装器获取值被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60942058/