c++ - map 包装器获取值被覆盖

标签 c++ stl

我正在使用一个使用底层 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/

相关文章:

c++ - 使用不同于默认排序类 STL 集的迭代

c++ - 返回对 InputIterator 内部状态的引用是否合法?

c++ - 深度复制包含引用成员的结构 (C++)

c++ - 如何制作CDialog?

c++ - 如何在构造函数中初始化一个私有(private)变量栈?

c++ - 返回 2d vector 中索引 i、j 的所有组合,总和为所需值

c++ - 如何以优雅高效的方式实现各种迭代器类别?

c++ - 为什么这一行不编译?

c++ - 打印字符串数组的第一个/最后一个元素时出现问题

c++ - 将 C++ 中的 Rcpp 与 bcc 编译器集成