boost :: variant和void*指针

top*_*dev 2 c++ boost variant void-pointers

我需要一个包含任何用户定义类的实例的变体类型.所以我使用void*:

typedef boost::variant<void*, int, float, std::string> Tvariant;
Run Code Online (Sandbox Code Playgroud)

我用地图创建了一个包装类:

typedef std::map<std::string, Tvariant> Tvalues;
Run Code Online (Sandbox Code Playgroud)

用法示例:

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
Run Code Online (Sandbox Code Playgroud)

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

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

可能的解决方案:

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

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

whe*_*ies 6

你看看Boost :: Any吗?这是通过编译时对类型转换的知识,同时通过Any隐藏它的真实类型.

  • @topright:`boost :: any`提供运行时类型检查,`any_cast`要求你指定要检索的类型,例如.`myclass*c = any_cast <MyClass*>(myMap ["myClassObj"])`,如果你对类型错了,会抛出`bad_any_cast`.由于你将在地图中查找值,我怀疑`boost :: any`的开销与你相关.提升任何语法都非常干净,非常安全. (2认同)