【问题标题】:boost::variant and void* pointersboost::variant 和 void* 指针
【发布时间】:2011-06-22 18:51:08
【问题描述】:

我需要一个包含任何用户定义类的实例的变体类型。所以我使用 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&lt;void*, typeid&gt; typeid_map 中所有 void* 值(添加时)的 typeid。当用户请求 void* 值并将其转换为任何 TClass* 时,让我们评估一个断言:assert(typeid_from_typeid_map == typeid(TClass*))

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

【问题讨论】:

    标签: c++ boost variant void-pointers


    【解决方案1】:

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

    【讨论】:

    • 是的,但是 boost::any 不提供编译时检查并且比 boost::variant 慢。将任何值转换为用户定义的类时,boost::any 是否提供类型安全?
    • @topright 因为您已经在使用 Boost,所以 boost::any 似乎是可行的方法。
    • @topright: boost::any 提供运行时类型检查,any_cast 要求您指定要检索的类型,例如。 Myclass* c = any_cast&lt;MyClass*&gt;(myMap["myClassObj"]),如果您对类型有误,则会抛出 bad_any_cast。由于您将在地图中查找值,我怀疑boost::any 的开销与您有关。 Boost any 在语法上非常干净,而且非常安全。
    • @topright gamedev 很抱歉,我没有时间以更具解释性的方式充实我的答案。我通常只在需要几分钟的停机时间、周末或下班时间时发布。
    • @wheaties,没关系,我已经知道 boost::any 并且我只是更改了我的实现以使用它。我关心的是性能和类型安全。
    猜你喜欢
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 2012-12-11
    • 2012-07-01
    • 1970-01-01
    • 2013-12-18
    相关资源
    最近更新 更多