當(dāng)1994年蔽豺,Erwin Unruh在C++標(biāo)準(zhǔn)委員會(huì)上演示了通過(guò)C++模板在編譯期計(jì)算素?cái)?shù)的程序后担映,C++模板元編程的能力就已經(jīng)被人們認(rèn)識(shí)到了嘱蛋。但是由于函數(shù)式編程和廣大程序員所熟悉的命令式編程存在著較大差異,以及C++標(biāo)準(zhǔn)和C++編譯器對(duì)模板元編程支持上的很多漏洞媒抠,導(dǎo)致了模板元編程的代碼在一般程序員的眼中十分的晦澀難懂弟断。所以隨后的很多年,模板元編程只被掌握在少數(shù)C++程序員手中趴生,而在更大多數(shù)人眼中則更似是一種奇技淫巧阀趴。
雖然如此,由于人們對(duì)計(jì)算機(jī)程序的表達(dá)力和性能的同時(shí)追求苍匆,C++模板元編程的使用還是滲透在非常多優(yōu)秀的框架和程序庫(kù)中刘急。往往你看一個(gè)漂亮的C++庫(kù)或者框架的源碼,都會(huì)驚奇的發(fā)現(xiàn)浸踩,為其漂亮點(diǎn)睛叔汁、化腐朽為神奇的那段核心代碼中,都離不開(kāi)模板元編程的身影检碗。因?yàn)槟0逶幊痰木幾g期計(jì)算和代碼生成的能力据块,可以讓你的程序更加的靈活、簡(jiǎn)潔折剃、安全并且高效另假。
正是如此,C++標(biāo)準(zhǔn)庫(kù)STL中就使用了非常多的模板元編程技巧怕犁,而且也給程序員提供了很多好用的模板元編程工具浪谴,例如我們之前提到的豐富的type_traits
工具集。而boost中的mpl因苹,則是一個(gè)完全為模板元編程打造的庫(kù)苟耻。它實(shí)現(xiàn)了完備的編譯期數(shù)據(jù)結(jié)構(gòu)和算法,以及各種常用的元編程模式扶檐。Mpl甚至還實(shí)現(xiàn)了一套編譯期的lambda架構(gòu)凶杖,用于在模板元編程中使用編譯期的lambda表達(dá)式。但是遺憾的是款筑,mpl的實(shí)現(xiàn)過(guò)程中同時(shí)大量的使用了boost的預(yù)處理元編程技術(shù)智蝠,導(dǎo)致代碼非常的晦澀難懂腾么,對(duì)想通過(guò)閱讀mpl源碼來(lái)學(xué)習(xí)模板元編程的同學(xué)增加了非常大的噪音干擾。
自從C++11標(biāo)準(zhǔn)發(fā)布后杈湾,C++語(yǔ)言和主流編譯器對(duì)模板以及編譯期計(jì)算的支持已經(jīng)逐漸完備解虱,同時(shí)標(biāo)準(zhǔn)修復(fù)了不少漏洞,使得模板元編程的代碼可以書(shū)寫(xiě)的更加自然和簡(jiǎn)單漆撞。為此殴泰,我基于C++11標(biāo)準(zhǔn)實(shí)現(xiàn)了一套針對(duì)C++模板元編程的基礎(chǔ)庫(kù)TLP。這個(gè)庫(kù)的主要目的是幫助大家更容易地學(xué)習(xí)C++模板元編程浮驳,正因如此我在寫(xiě)的過(guò)程中不斷地追求代碼的表達(dá)力和清晰性悍汛。為了能夠通過(guò)測(cè)試用例來(lái)展示庫(kù)組件的用法,我專門(mén)編寫(xiě)了一個(gè)面向模板元編程進(jìn)行編譯期測(cè)試的xUnit測(cè)試框架至会,TLP庫(kù)中的所有組件都經(jīng)過(guò)了該測(cè)試框架的測(cè)試离咐。
雖然你的軟件可以直接依賴整個(gè)TLP庫(kù),但是對(duì)于C++這么一門(mén)讓程序員追求極致的語(yǔ)言奉件,學(xué)會(huì)TLP中模板元編程的設(shè)計(jì)技巧宵蛀,然后按需所取地去解決自己的問(wèn)題顯得更為實(shí)際。而且模板元編程的特點(diǎn)決定了它不應(yīng)該出現(xiàn)在你軟件中的每一處县貌,正常情況下只是在最核心地方去解決一些關(guān)鍵的問(wèn)題术陶。所以你應(yīng)該把TLP庫(kù)當(dāng)做一個(gè)素材庫(kù),學(xué)習(xí)并掌握里面每個(gè)組件和算法的設(shè)計(jì)窃这,學(xué)會(huì)針對(duì)你的具體問(wèn)題采用類似的設(shè)計(jì)技巧去解決問(wèn)題瞳别。為了讓大家能夠更好地學(xué)習(xí)TLP庫(kù)中的代碼設(shè)計(jì),我寫(xiě)了這篇手冊(cè)杭攻,介紹了模板元編程的基礎(chǔ)知識(shí)以及TLP庫(kù)中關(guān)鍵組件和算法的實(shí)現(xiàn)技巧祟敛,最后還列舉了模板元編程的一些具體應(yīng)用。在這個(gè)手冊(cè)中兆解,我同時(shí)提到了很多對(duì)編程語(yǔ)言和軟件設(shè)計(jì)的理解馆铁,希望也會(huì)對(duì)大家有用。
正如我最開(kāi)始所說(shuō)锅睛,模板元編程是中級(jí)C++程序員邁向高級(jí)的必經(jīng)之路埠巨,希望本文以及TLP庫(kù)中的代碼對(duì)大家更好地學(xué)習(xí)模板元編程起到幫助,使得我們可以在C++中以一種更有效现拒、更酷的方式去解決問(wèn)題辣垒。
** 作者: MagicBowen**
** Email:e.bowen.wang@icloud.com **
** 轉(zhuǎn)載請(qǐng)注明作者信息,謝謝印蔬!**