boost::variant 和 void* 指针
我需要一个包含任何用户定义类的实例的变体类型。所以我使用 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* 有 2 个问题: 使用
- 指向动态分配内存的指针复制属性是危险且容易出错的。
- 用户可以将 void* 静态转换为 WrongClass*,而不是 MyClass*。它可以编译,但结果是不可预测的。
可能的解决方案:
- 使用 boost::shared_ptr<无效*>。
- 记住 std::map
中所有 void* 值(添加时)的 typeid。 typeid_map。当用户请求 void* 值并将其转换为任何 TClass* 时,让我们评估一个断言: assert(typeid_from_typeid_map == typeid(TClass*))
。
问题:
1.是否有其他解决方案来保存任何用户定义类的值?
2. 您是否会针对上述问题推荐更好的解决方案并指出其他一些问题?
I need a variant type that holds instances of any user-defined class. So I use void*:
typedef boost::variant<void*, int, float, std::string> Tvariant;
I've created a wrapper class with a map:
typedef std::map<std::string, Tvariant> Tvalues;
Example of usage:
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
There are 2 issues with this void* in variant class:
- Copying attributes with pointers to dynamically allocated memory is dangerous and error-prone.
- User can static_cast void* to WrongClass*, not to MyClass*. It compiles, but result is unpredicted.
Possible solutions:
- Use boost::shared_ptr< void* >.
- Remember typeid for all void* values (when they are added) in the
std::map<void*, typeid> typeid_map
. When user requests for void* value, casting it to any TClass*, let's evaluate an assertion:assert(typeid_from_typeid_map == typeid(TClass*))
.
Questions:
1. Are there other solutions to hold values of any user-defined class?
2. May be you will recommend better solutions for mentioned issues and point some other issues?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你看过Boost::Any吗?这是带有类型转换的编译时知识的东西,同时通过 Any 隐藏它的真正类型。
Have you look at Boost::Any? This is something that carries with it compile time knowledge of the casting of the type while hiding what type it really is via the Any.