我正在閱讀有關C++元編程的Abrahams,Gurtovoy書。我必須承認,我不明白使用模板元編程的解釋。例如:C++元編程,爲什麼和什麼時候應該使用?
您想要根據問題域的抽象表示代碼。
或者:
否則你將不得不寫的樣板實現代碼很大。
有人能詳細說明嗎?
我正在閱讀有關C++元編程的Abrahams,Gurtovoy書。我必須承認,我不明白使用模板元編程的解釋。例如:C++元編程,爲什麼和什麼時候應該使用?
您想要根據問題域的抽象表示代碼。
或者:
否則你將不得不寫的樣板實現代碼很大。
有人能詳細說明嗎?
我也使用C++進行科學計算,是的,模板元編程有很大的幫助。一種用途是幫助實現通用數值方法。一個典型的例子是std::sort
,這是一種排序的抽象,它可以用於任何你想要排序的東西。
同樣,可能會寫入,比方說,一個模板樣條內插,可以內插Y(X)的任何類型的x
實現標量的概念(訂購,運營商+
-
*
),然後鍵入y
即interpolateable(允許y+y
,y-y
,y*x
)。一旦你建立了這樣一個模板,你就可以使用它來插入,比如double
(代表時間)的某種矩陣類型,而不需要進一步的改編:它只是立即生效(儘管編譯器必須做一些工作)。
您想要根據問題域的抽象表示代碼。
模板元編程(TMP)可用於分離和抽象代碼中的不同任務。例如,Boost.Serialization被實現爲完全不知道您的(用戶)代碼。你只需要提供一些粘合劑,以一種serialize()
成員函數的形式提供,而Boost.Serialize將能夠無縫地與你的類一起工作。由於這些都是在編譯期間完成的,所以這種靈活性並不會導致運行成本(與多態性相反)。
否則,您將不得不編寫大量的樣板實現代碼。
TMP技術可用於生成代碼,並有效地分解通用代碼。例如,Boost.Intrusive可讓您在類中(通過各種方式,例如繼承或類型特徵)「導入」行爲,而這只不過是生成代碼並將其注入到類中以將其轉換爲列表,例如列表節點。
Thanks.I打算使用C++進行科學計算,序列化是否用於此? –
@RichardRublev這些是我頭頂的兩個例子,我不知道這兩個特定的東西對你是否有用。然而,科學計算看起來像一個可以使用TMP進行編譯時抽象的領域,並且真正受益於速度提升(與「經典」,多態驅動的抽象相比)。 – Quentin
關於亞馬遜的第一章,我看到它立即開始通過詳細解釋並舉例說明。 –