2011-11-21 95 views
0

所以,我做了一個簡單的元組類使用可變模板...如何從一個可變元組中獲取元素?

我將如何去做一個工作get方法/幫助函數?我正在使用的當前版本會導致編譯器期望在空元組中定義一個get。

下面的代碼:

template<typename... T> 
class tuple; 

template< > 
class tuple< > { }; 

template<typename U, typename... T> 
class tuple<U, T...> 
{ 
public: 
    tuple() {}; 
    tuple (U f, T... r); 

    U get (int idx, int numCalls = 0) const; 

    U first_; 
    tuple<T...> rest_; 
}; 

template<typename U, typename... T> 
tuple<U, T...>::tuple (U f, T... r) 
{ 
    first_ = f; 
    rest_ = tuple<T...> (r...); 
} 

template<typename U, typename... T> 
U tuple<U, T...>::get (int idx, int numCalls) const 
{ 
    if (idx == numCalls) 
    return first_; 

    return rest_.get (idx, numCalls + 1); 
} 

感謝您的幫助!

+0

如果這不是作業:你是否從''簽出'std :: tuple'? –

+3

只有所有類型都是相同的,你的'get'函數纔會起作用,這不是元組背後的意圖。 – Xeo

回答

0

爲了讓您的當前代碼正常工作,請在空元組中使用get函數返回任何內容。
另外,較好地解決它來獲得與參數的數量的參數你喜歡:

template<typename U, int N> 
U get() 

,然後使其與簡化的N傳球推進,當n爲0時,專門就返回元件。

1

添加一個專業化的一個類型以及零種類型:

template <typename T> 
class tuple 
{ 
    T first_; 

    // get() ... 
} 

請注意,你的設計的效率非常低。首先,get索引應該是一個編譯時常量參數,所以你需要get<i>(就像std::tuple一樣)。您的運行時代碼不包含錯誤檢查,無法在編譯時捕獲無效的調用。其次,你所有的構造函數都執行大量的拷貝,這些拷貝可能會被修改以允許完美的轉發。