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のmoveコンストラクターを(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>

悲しいことに、サポートはまれであり、GCC4.8でさえサポートされていません。:(

于 2013-03-24T10:00:11.550 に答える
2

最も簡単な方法(特に右辺値がない場合-これ)は、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 に答える