2016-05-09 49 views
2

我在爲了好玩而在C++中實現元組,並且陷入了困境,因爲下面的類修改了它,以便我可以通過使用模板輕鬆地通過僅使用索引來提取每個元素。類似於std :: get。我將如何實現一個函數來提取這個類的元素?

TL; DR:如何提取元組內的元素的實現看起來像?

template<typename first_t, typename ... arg_v> 
class Tuple : public Tuple<arg_v ...> 
{ 
public: 

    Tuple() 
    { 
    } 

    Tuple(const first_t&& A) : 
     element(A) 
    { 
    } 

    Tuple(const first_t& A, arg_v& ... args) : 
     element(A), Tuple<arg_v ...>::Tuple(args ...) 
    { 
    } 

    Tuple(const first_t&& A, arg_v&& ... args) : 
     element(A), Tuple<arg_v ...>::Tuple(args ...) 
    { 
    } 

    first_t element; 
}; 

template<typename last_t> 
class Tuple<last_t> 
{ 
public: 
    Tuple() 
    { 
    } 

    Tuple(const last_t& A) : 
     element(A) 
    { 
    } 

    Tuple(const last_t&& A) : 
     element(A) 
    { 
    } 
    last_t element; 
}; 
+1

您可以查看boost :: tuple或std :: tuple的源代碼以獲取指導。 –

+0

你的移動構造函數不正確 - 'const &&不是你可以移動的東西,然後你也不會從任何東西移動。 – Barry

回答

1

我使用了遞歸方法。 我知道指向void的指針是邪惡的,但我們不知道哪個類型將被返回,只有誰在使用代碼才知道它;我們想要的類型只能在最後的get之前執行。

請記住,這段代碼會將void*轉換爲你想要的東西而不做任何檢查。

class Tuple : public Tuple<arg_v ...> 
{ 
    template<typename T> 
    void get(int index, T& out) 
    { 
     out = *static_cast<T*>(get(index)); 
    } 

    void* get(unsigned int index) 
    { 
     if (index == 0) 
      return &element; 
     else 
      return Tuple<arg_v ...>::get(index - 1); 
    } 
}; 
class Tuple<last_t> 
{ 
    void* get(unsigned int) 
    { 
     return &element; 
    } 
}; 
+1

'static_cast >'複製 –

+1

我改變了它,現在它沒有強制轉換就訪問基類。謝謝。 – FedeWar

相關問題