2013-03-24 79 views
2

讓我們假設我有一個非STL矢量類型,它與std :: vector兼容operator std::vector<T>。是否有可能移動其元素爲std :: vector的而不是默認的拷貝構造,使擴展std :: vector以移動其他矢量類型的元素

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

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

將使用SomeClass的的移動構造函數(3次)創建的std ::矢量sv什麼時候?

我想象像

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

,但沒有發現任何可行的解決方案呢。


爲了說明,這是性病::矢量運營商是如何定義的:

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); 
    } 
} 
+1

你想在那裏move_iterator – 2013-03-24 09:54:35

+1

而你要C++ 11 *這個參考機制,所以你可以重載是否這是一個左值還是右值 – 2013-03-24 09:58:34

回答

5

我認爲你需要rvalue references for *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也沒有。 :(

+0

鏗鏘支持他們;) – 2013-03-24 11:02:06

+0

現在,我已經讀過這個問題,+1 – 2013-03-24 11:09:53

+0

非常有趣,我確定C++ 11會以某種方式解決這個問題:)然後,我會等到它得到更廣泛的支持。 – AndiDog 2013-03-24 14:20:20

1

最簡單的事情(特別是如果你沒有右值 - 這)是利用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()); 
} 
相關問題