2013-11-20 112 views
2

我很新的Boost融合,也許我的問題沒有任何意義。融合表現爲:「運行時和編譯時算法之間的融合」。我想我在編譯時完成的工作和在運行時完成的融合工作之間會迷失方向。編譯時間與運行時間與boost :: fusion

讓我們的for_each模板,其實它們是兩個! functionmetafunction。 這個元函數看起來像我作爲for_each函數的特徵類模板,錯了?

for_each函數的例子:

struct increment 
{ 
    template<typename T> 
    void operator()(T& t) const 
    { 
     ++t; 
    } 
}; 

vector<int,int> vec(1,2); 
for_each(vec, increment()); 

我明白for_each環路將在編譯時產生被展開類似的代碼

++at_c<0>(vec); 
++at_c<1>(vec); 

(顯然at_c<x>模板也將產生代碼以訪問融合載體部件)

對我來說,兩者的for_each功能和metafun ction是「編譯時間程序」,又錯了?

有人可以解釋我(用一個簡單的例子)boost融合的什麼部分只是編譯時間元程序,什麼是經典的編譯時代碼?

回答

2

boost :: fusion是關於操縱異類集合的類型。在C++中,類型的處理是在編譯時(元函數)處理的,而值處理主要是在運行時(函數)處理的。

如果您在升壓::融合的文檔仔細觀察,你會看到,元函數返回之類的東西...... ::類型。這些類型必須在編譯時進行處理。

在C++中,有類似RTTI(運行時類型信息),但在大多數情況下,它的能力被轉移到確定在運行時的東西類型。運行時沒有可用的類型操作。

因此,操作類型與在編譯時處理。命令式編程結構在編譯時並不有用。 C++編譯時結構更類似於函數式編程結構。我花了很長時間來說boost :: fusion :: for_each是一個在編譯時展開循環的算法,以便在編譯時序列中的所有類型都是可見的「以線性方式」。

值對於每種類型的然後在運行時類型取消引用。

因此,即將到來的完整的循環,boost :: fusion :: for_each函數提供了值,boost :: fusion :: for_each元函數返回一個類型,這對於通過函數來​​間接獲取關聯值。

+0

好的,謝謝Raymond,我認爲我的問題主要反映了我對融合的無知。我會縮短它以使其對其他融合新手有用。 – Laurent