2010-10-28 35 views
17

我想知道元組是如何在C++ 0x標準庫中實現的。我試圖讀取description in libstdc++ manual,然後閱讀template listing,但真的很難理解它是如何工作的,特別是在閱讀代碼時。std :: tuple是如何實現的?

有人能解釋我在幾句話中的元組實現的想法嗎?我想知道這一點,因爲我想在我的代碼中使用元組,並且我想了解它是如何工作的以及它帶來的開銷類型(僅延長編譯時間,在內存上執行許多複製操作,在構造函數中執行許多其他函數等)。

回答

23

實現元組的一種方法是使用多重繼承。元組元素由葉子類保存,而元組類本身從多個葉子繼承。在僞碼:

template<typename T0, typename T1, ..., typename Tn> 
class PseudoTuple : TupleLeaf<0, T0>, TupleLeaf<1, T1>, ..., TupleLeaf<n, Tn> { 
    ... 
}; 

每個葉有索引,使得每個基類變得即使它們包含的類型是相同的唯一的,因此我們可以用一個簡單的static_cast訪問第n元件:

static_cast<TupleLeaf<0, T0>*>(this); 
// ... 
static_cast<TupleLeaf<n, Tn>*>(this); 

我已經寫了這個「扁平化」的元組在這裏實施了詳細的解釋:C++11 tuple implementation details (Part 1)

+0

是的,這是一個很好的解釋!不幸的是,這不是如何將元組實現到libstdC++中,哪一個堅持遞歸實現。不能等待更廣泛分佈的libC++! – 2014-07-07 23:19:22

+0

也可以簡要描述非遞歸實現。 – 2015-04-14 22:36:48

+1

@KyleStrand erm,這是_is_非遞歸實現(T:L1,L2,L3與T:L1:L2:遞歸實現的L3) – mitchnull 2015-04-16 07:54:30

2

實施std::tuple可能通過variadic templates,被引入到核心語言。

我知道這是乞討的問題,但它會給你一個更好的搜索短語來研究。

+2

另外,實施是*不*小事,證明由OP提到的嘗試和失敗,以瞭解事實它由rea定義了一個示例實現的代碼。 – 2015-04-14 22:35:41

+2

這個答案正在討論[在元](http://meta.stackoverflow.com/questions/290254/for-the-question-how-is-x-implemented-is-its-trivial-using-feature-y -an-AN)。 – Daedalus 2015-04-14 23:12:21

+1

@KyleStrand OP在2010年閱讀代碼時,可變參數模板尚未被普遍理解。我給了他工具來理解可變參數模板。我認爲這是一個答案。 – Motti 2015-04-15 06:37:30

10

元組通常作爲編譯時間鏈表來實現。

該代碼是一個比特通過模板語法混淆,但以下元件通常存在:

  1. 與頭部和尾部元件類鏈(利弊元素)
  2. 空尾實例指出列表的結尾。
  3. 遞歸代碼將列表移到某個索引,實現爲遞歸模板實例(在編譯時實例化)。

在C++ 03中存在合理的實現(例如boost)。

如Motti所述,可變元模板允許無限數量的元素。

成本通常是一個編譯時間。複製構造函數可能在初始化過程中被調用(max 1),並且在複製元組時自己。

相關問題