我无法使用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语义。