roz*_*ina 7 c++ vector move-semantics c++03
我只能访问C++ 03,而且我经常想要将一个向量移动到一个函数中,就像在C++ 11中一样.如何做的问题不要过多地混淆代码的用户.所以我的问题是程序员在C++ 11之前是如何做到的.
我知道可以使用交换功能"移动"向量.所以这就是我提出的:
class Foo
{
public:
Foo(std::vector<int>& vec)
{
using std::swap;
swap(vec, m_vec); // "move" vec into member vector
}
private:
std::vector<int> m_vec;
};
// usage:
std::vector<int> v(100, 1337);
Foo foo(v);
// v.empty() == true
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,用户不明白他们的矢量将被移动到类Foo中.有这种问题的最佳实践解决方案吗?提前致谢!
您可以使用一些具有显式名称的包装器:
template <typename T>
class MyMove
{
public:
explicit MyMove(T& t) : t(t) {}
T& get() {return t;}
private:
T& t;
};
template <typename T>
MyMove<T> myMove(T& t) { return MyMove<T>(t); }
Run Code Online (Sandbox Code Playgroud)
然后
class Foo
{
public:
Foo(MyMove<std::vector<int>> vec)
{
using std::swap;
swap(vec.get(), m_vec); // "move" vec into member vector
}
private:
std::vector<int> m_vec;
};
Run Code Online (Sandbox Code Playgroud)
用法:
std::vector<int> v(100, 1337);
Foo foo(myMove(v));
Run Code Online (Sandbox Code Playgroud)
您可以定义包含引用的类型和包装它的函数,以提供类似于在调用站点移动语义的类型.有点像
template <typename T> struct move_ref {
explicit move_ref(T & ref) : ref(ref) {}
T & ref;
};
template <typename T> move_ref<T> move(T & t) {return move_ref<T>(t);}
Foo(move_ref< std::vector<int> > vec)
{
using std::swap;
swap(vec.ref, m_vec); // "move" vec into member vector
}
Foo foo(move(v));
Run Code Online (Sandbox Code Playgroud)
或者,Boost有一个库,允许在没有C++ 11的情况下移动语义.