我想知道元組是如何在C++ 0x標準庫中實現的。我試圖讀取description in libstdc++ manual,然後閱讀template listing,但真的很難理解它是如何工作的,特別是在閱讀代碼時。std :: tuple是如何實現的?
有人能解釋我在幾句話中的元組實現的想法嗎?我想知道這一點,因爲我想在我的代碼中使用元組,並且我想了解它是如何工作的以及它帶來的開銷類型(僅延長編譯時間,在內存上執行許多複製操作,在構造函數中執行許多其他函數等)。
我想知道元組是如何在C++ 0x標準庫中實現的。我試圖讀取description in libstdc++ manual,然後閱讀template listing,但真的很難理解它是如何工作的,特別是在閱讀代碼時。std :: tuple是如何實現的?
有人能解釋我在幾句話中的元組實現的想法嗎?我想知道這一點,因爲我想在我的代碼中使用元組,並且我想了解它是如何工作的以及它帶來的開銷類型(僅延長編譯時間,在內存上執行許多複製操作,在構造函數中執行許多其他函數等)。
實現元組的一種方法是使用多重繼承。元組元素由葉子類保存,而元組類本身從多個葉子繼承。在僞碼:
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)
實施std::tuple
可能通過variadic templates,被引入到核心語言。
我知道這是乞討的問題,但它會給你一個更好的搜索短語來研究。
另外,實施是*不*小事,證明由OP提到的嘗試和失敗,以瞭解事實它由rea定義了一個示例實現的代碼。 – 2015-04-14 22:35:41
這個答案正在討論[在元](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
@KyleStrand OP在2010年閱讀代碼時,可變參數模板尚未被普遍理解。我給了他工具來理解可變參數模板。我認爲這是一個答案。 – Motti 2015-04-15 06:37:30
元組通常作爲編譯時間鏈表來實現。
該代碼是一個比特通過模板語法混淆,但以下元件通常存在:
在C++ 03中存在合理的實現(例如boost)。
如Motti所述,可變元模板允許無限數量的元素。
成本通常是一個編譯時間。複製構造函數可能在初始化過程中被調用(max 1),並且在複製元組時自己。
是的,這是一個很好的解釋!不幸的是,這不是如何將元組實現到libstdC++中,哪一個堅持遞歸實現。不能等待更廣泛分佈的libC++! – 2014-07-07 23:19:22
也可以簡要描述非遞歸實現。 – 2015-04-14 22:36:48
@KyleStrand erm,這是_is_非遞歸實現(T:L1,L2,L3與T:L1:L2:遞歸實現的L3) – mitchnull 2015-04-16 07:54:30