boost::variant 和 void* 指针

发布于 2024-10-16 08:58:14 字数 1089 浏览 1 评论 0原文

我需要一个包含任何用户定义类的实例的变体类型。所以我使用 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 个问题: 使用

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

可能的解决方案:

  1. 使用 boost::shared_ptr<无效*>。
  2. 记住 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:

  1. Copying attributes with pointers to dynamically allocated memory is dangerous and error-prone.
  2. User can static_cast void* to WrongClass*, not to MyClass*. It compiles, but result is unpredicted.

Possible solutions:

  1. Use boost::shared_ptr< void* >.
  2. 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

柏林苍穹下 2024-10-23 08:58:14

你看过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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文