我不能使用 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 右值语义。