boost::ptr_vector 和 boost::any 的问题

Posted

技术标签:

【中文标题】boost::ptr_vector 和 boost::any 的问题【英文标题】:Problems with boost::ptr_vector and boost::any 【发布时间】:2009-05-19 00:36:49 【问题描述】:

好的,所以我有一个疑问,我想知道这是否可能:

我正在使用带有通用数据(字符串、整数、布尔值等...)的数据库。每当构造对象或修改对象的成员时,我都必须使用特定操作(SELECT 或 UPDATE)查询数据库。 首先,这不是与数据库相关的问题,我真正的问题是我有一个 ptr_vector,它保存了 boost::any 指向对象成员的指针。在这样的代码中:

class Enemy
  private:
    //some private data...
  public:
    auto_ptr<int> ID_Enemy;
    auto_ptr<string> Enemy_Name;
    //miscellaneous methods...
;

然后我将要修改的成员传递给另一个杂项类的函数,该函数以 boost::any*: 为参数:

misc_class.addValues((boost::any*)(ID_Enemy.get()));
misc_class.addValues((boost::any*)(Enemy_Name.get()));

同一个类接受any*,并执行以下操作:

auto_ptr<boost::any> val2(val); //being val, the passed any*
Enemy_Values.push_back(val2);

Enemy_Values 是一个 ptr_vector。因此,当我访问这个以 Enemy_Values 作为成员的 misc_class 时,我想更改内部的 auto_ptr 指向的值:

misc_class.Enemy_Values[0] = (boost::any)(69);

在这里,我得到一个违规错误。我尝试了很多事情,有人告诉我,我不应该使用 auto_ptr 容器或使用 boost::any 来回转换。这是我正在做的可能,还是有更好更直观的方法?

提前致谢。

【问题讨论】:

【参考方案1】:

(boost::any*)(ID_Enemy.get()) 执行reinterpret_cast,因为您正在转换不相关的指针类型。这意味着你得到一个指向any 的无效指针,它指向真正的整数。 相反,构造一个临时的 boost::any 对象并通过引用传递给 addValues:

misc_class.addValues(boost::any(ID_Enemy.get());

您对auto_ptr 的使用实际上是不正确的:auto_ptr 删除了freestore 上的对象,但这里我们处理的是本地对象。 addValues 只需要将any 对象的 推入向量中即可:

Enemy_Values.push_back(val);

...并且 Enemy_Values 应该只是一个 std::vector。

可以使用 ptr_vector 和 freestore 分配的 boost::any 对象来执行此操作,但这会比必要的复杂。

【讨论】:

【参考方案2】:

auto_ptr 有一个number of problems。既然你已经在使用 boost,为什么不改用 boost::shared_ptr 呢?

【讨论】:

以上是关于boost::ptr_vector 和 boost::any 的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何从 boost::ptr_vector 中删除“this”

boost::ptr_vector 的引用或指针表示法

boost::ptr_vector 与 std::vector<std::unique_ptr<T>>? [关闭]

阿迪bounce和boost哪个走路舒服 bounce和boost对比

Boost 和 Boost.Build 的设置

Boost.Asio和Boost的联系和区别