gpt4 book ai didi

c++ - boost::variant 和 void* 指针

转载 作者:搜寻专家 更新时间:2023-10-31 00:21:11 25 4
gpt4 key购买 nike

我需要一个变体类型来保存任何用户定义类的实例。所以我使用 void*:

typedef boost::variant<void*, int, float, std::string> Tvariant;

我创建了一个带有 map 的包装器类:

typedef std::map<std::string, Tvariant> Tvalues;

使用示例:

int x = 123;
attributes.set("int_var", x);
x = attributes.get<int>("int_var");

MyClass* obj = new MyClass();
attributes.set("void*_var", obj);
obj = static_cast<MyClass*>( attributes.get<void*>("void*_var") );
obj = attributes.cast<MyClass*>("void*_var"); // the same

变体类中的这个 void* 有两个问题:

  1. 复制带有指向动态分配内存的指针的属性是危险且容易出错的。
  2. 用户可以 static_cast void* 到 WrongClass*,而不是 MyClass*。它编译,但结果是不可预测的。

可能的解决方案:

  1. 使用 boost::shared_ptr< void* >。
  2. 记住 std::map<void*, typeid> typeid_map 中所有 void* 值(添加时)的 typeid .当用户请求 void* 值时,将其转换为任何 TClass*,让我们评估一个断言:assert(typeid_from_typeid_map == typeid(TClass*)) .

问题:
1. 是否有其他解决方案来保存任何用户定义类的值?
2. 您可能会针对上述问题推荐更好的解决方案并指出其他一些问题?

最佳答案

你看过Boost::Any吗? ?这是一种带有类型转换的编译时知识的东西,同时通过 Any 隐藏它真正的类型。

关于c++ - boost::variant 和 void* 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4922404/

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