你如何构造一个可以分配scoped_ptr的boost变量?

时间:2013-08-22 21:04:35

标签: c++ boost

我无法使用C ++ 11中引入的移动语义,因此要模拟移动语义,我偶尔会使用scoped_ptr并明确使用swap来显示所有权更改。

我遇到了一个问题,我不知道如何使用包含的boost :: variant类型执行此操作。为简单起见,请使用这个天真的例子:

  #include <boost/scoped_ptr.hpp>
  #include <boost/variant.hpp>
  #include <string>
  #include <vector>

  typedef boost::variant<
                     boost::scoped_ptr<std::string>,
                     boost::scoped_ptr<std::vector<std::string> > vType;

  int main(int argc, char **argv) {
     boost::scoped_ptr<std::vector<std::string> > vec = new std::vector;
     vType var;
     // How do I assign vec to var to hand off ownership and prevent 
     // recreation of the vector?
     // ??
     return 0;

  }

是否有类似boost::swap(boost::variant, value::type)重载或替代方法的内容,可以使用swap在变量内部的值类型上分配变量值?那将是理想的解决方案。


我已经考虑过的事情:

我可以使用shared_ptr来防止副本,但我宁愿使用scoped_ptr来强制执行单一所有权并删除shared_ptr的开销。

std :: auto_ptr会给我我想要的语义,但也很容易错误地进行分配和切换所有权。到目前为止,这似乎是我最好的选择,但出于上述原因,我故意远离它。

我可以为字符串和向量创建一个包装器类或模板,它在变体中使用,它具有一个内部像语义一样移动的复制赋值运算符,但我不妨使用std :: auto_ptr。

我可以创建一个union(like)类而不是使用boost :: variant,但是我希望利用一些可用的工具来处理变量类型。

那么我列举的选项还有其他任何建议或好的论据吗?


更新

这个问题类似:boost::variant; std::unique_ptr and copy

即使该问题的结论是不可复制的类型不能与boost变体一起使用,我仍然需要解决我的一般用法:在将我的类型分配给boost :: variant时移动语义而没有可用性C ++ 11 rvalue语义。

0 个答案:

没有答案