我需要一个包含任何用户定义类的实例的变体类型。所以我使用 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* 在变体类中有两个问题:
- 使用指向动态分配内存的指针复制属性是危险的并且容易出错。
- 用户可以将 void* 静态转换为 WrongClass*,而不是 MyClass*。它编译,但结果是不可预测的。
可能的解决方案:
- 使用 boost::shared_ptr< void* >。
- 记住所有 void* 值(添加时)的 typeid
std::map<void*, typeid> typeid_map
。当用户请求 void* 值,将其转换为任何 TClass* 时,让我们评估一个断言:assert(typeid_from_typeid_map == typeid(TClass*))
。
问题:
1. 是否有其他解决方案来保存任何用户定义类的值?
2. 可能你会为提到的问题推荐更好的解决方案并指出其他一些问题?