1

我不能使用 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。

我可以创建一个联合(类似)类而不是使用 boost::variant,但我想利用一些可用的工具来处理变体类型。

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


更新

这个问题类似:boost::variant; std::unique_ptr 和复制

尽管该问题的结论是不可复制类型不能与 boost 变体一起使用,但我仍然需要解决我的一般用例:在没有 C+ 的情况下将我的类型分配给 boost::variant 时移动语义+11 右值语义。

4

0 回答 0