2

假设我有一个与 std::vector 兼容的非 STL 向量类型operator std::vector<T>。是否可以其元素移动到 std::vector 而不是默认的复制构造,以便

OtherVectorType<SomeClass> f()
{
    OtherVectorType<SomeClass> v;
    v.pushBack(SomeClass());
    v.pushBack(SomeClass());
    v.pushBack(SomeClass());
    return v;
}

std::vector<SomeClass> sv = f();

创建 std::vector 时会使用 SomeClass 的移动构造函数(3 次)sv吗?

我想像

template<typename T>
std::vector<T>& operator= (std::vector<T>& self, OtherVectorType<T>&& from)
{
    [...]
}

但还没有找到任何可行的解决方案。


为了说明,这是 std::vector 运算符的定义方式:

template<typename T> class OtherVectorType
{
    [...]

    operator std::vector<T>() const
    {
        if (!m_size)
            return std::vector<T>();

        return std::vector<T>(reinterpret_cast<T*>(m_pElements),
                              reinterpret_cast<T*>(m_pElements) + m_size);
    }
}
4

2 回答 2

5

我认为您需要*this支持.

operator std::vector<T>() const &; // copy your own type's data
operator std::vector<T>() &&;      // move it into the std::vector<T>

可悲的是,支持很少,即使 GCC 4.8 也没有。:(

于 2013-03-24T10:00:11.550 回答
2

最简单的事情(特别是如果你没有 rvalue-this)是使用make_move_iterator如下所示:

#include <deque>
#include <vector>
#include <memory>
#include <iterator>

typedef std::unique_ptr<int> SomeClass;
typedef std::deque<SomeClass> OtherVectorType;

OtherVectorType
f()
{
    OtherVectorType v;
    v.push_back(SomeClass(new int (1)));
    v.push_back(SomeClass(new int (2)));
    v.push_back(SomeClass(new int (3)));
    return v;
}

std::vector<SomeClass>
to_vector(OtherVectorType&& o)
{
    return std::vector<SomeClass>(std::make_move_iterator(o.begin()),
                                  std::make_move_iterator(o.end()));
}

int main()
{
    std::vector<SomeClass> v = to_vector(f());
}
于 2013-03-25T14:31:12.487 回答