2012-01-26 30 views
1

深入研究優秀的boost tuple類(tuple_basic.hpp)的源代碼後,我可以看到在'get'方法中使用了遞歸模板化算法來訪問元組成員。boost tuple「get」方法是如何工作的?

我在努力理解的是數值模板參數如何映射到特定的成員名稱?此外,遞歸模板函數不會收斂到第一個元素(如in,stop condition遞歸模板函數,得到< 0>())?,大於零的元素如何被訪問?

回答

2

當成寶貝例子,你能想象這樣的事情 - 只是一個固定類型的元組現在:

template <int N> struct MyTuple : MyTuple<N - 1> 
{ 
    T data; 
}; 
template <> struct MyTuple<0> { }; 

真實世界的解決辦法當然有數據類型的可變參數模板參數,並且還會提供一個可變參數構造函數,用第一個元素構造data並將其餘元素傳遞給基礎構造函數。

現在,我們可以嘗試訪問i個元素:

template <int K> struct get_impl 
{ 
    template <int N> static T & get(MyTuple<N> & t) 
    { 
     return get_impl<K - 1>::get(static_cast<MyTuple<N - 1>&>(t)); 
    } 
}; 
template <> struct get_impl<0> 
{ 
    template <int N> static T & get(MyTuple<N> & t) 
    { 
     return t.data; 
    } 
}; 

這裏的關鍵是要有一個專業化時K = 0,提取的實際元素,直到你在那裏投了繼承層次。最後,我們通過一個函數模板彈弓元組類型推演:

template <int K, int N> T & get(MyTuple<N> & t) 
{ 
    return get_impl<K>::get(t); 
} 
+0

這個我明白了,我不明白的是如何由多個值的元組是使用遞歸模板的方法來處理? – 2012-01-28 13:50:42

+0

@GearoidMurphy:您只需將可變參數模板參數添加到元組定義。你可以使用'auto' /'decltype'作爲'get'的返回值來使事情更簡單。 – 2012-01-28 13:52:49

+0

不是可變參數模板C++ x11?,boost tuple實現不依賴於此功能 – 2012-01-28 16:10:27