地图包装器获取值被覆盖

问题描述 投票:0回答:1

我正在使用使用基础地图的类。当我在课堂上使用下标运算符时,我看到基础地图的值被覆盖。我在做什么错?

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
c++ stl
1个回答
1
投票
obj.obj = static_cast<void*>(&data);

data是局部变量。您不能像这样保存其地址,因为data的生存期在函数返回时结束。 &data仅在功能期间有效。

如果要在变量中存储任意类型的值,请使用std::any(自C ++ 17起)。它具有一个值及其类型,与您尝试使用std::any类完全相同。

ObjAndType
© www.soinside.com 2019 - 2024. All rights reserved.