我正在使用使用基础地图的类。当我在课堂上使用下标运算符时,我看到基础地图的值被覆盖。我在做什么错?
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起)。它具有一个值及其类型,与您尝试使用std::any
类完全相同。
ObjAndType