2

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

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

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

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. 用户可以将 void* 静态转换为 WrongClass*,而不是 MyClass*。它编译,但结果是不可预测的。

可能的解决方案:

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

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

4

1 回答 1

7

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

于 2011-02-07T14:31:27.570 回答