猶如<<Ghost in the shell>>中的素子那樣,最近某天早上醒來(lái)后,“我的靈魂正對(duì)我低語(yǔ)”--C++中的某個(gè)部分似乎有些不對(duì)勁?。ㄠ?,<<The Matrix 2>>中的neo在最后關(guān)頭也說(shuō)過(guò)類似的話)
... ... (經(jīng)過(guò)一番思索)
我看過(guò)<<范型編程與STL>>、<<Moden C++ Design>>這類偏重于template的運(yùn)用,較長(zhǎng)一段時(shí)間對(duì)template的體驗(yàn)后,我懺悔:由于在class之前寫(xiě)了太多的template<...>,以至于有太多的時(shí)間在等待compiler的努力工作,花了過(guò)多的時(shí)間去分析模板參數(shù)推演失敗后的“壯觀錯(cuò)誤信息”,以至于不得不對(duì)含有template關(guān)鍵字的code小心萬(wàn)分,我知道,不這么做的話,一不小心就會(huì)云里霧里。
一般情況下,我們需要模板實(shí)現(xiàn)的值類型是必要的,容器類型用STL的基本上夠用了,而使用了大量template技巧的boost\Loki\GIL\......我希望我應(yīng)用端的code只需在完成一次于庫(kù)編譯連接后,不再影響其它的編譯單元的code,即,只在.cpp\.cxx文件中含入有巨量template的庫(kù)之*.h,以至于另一個(gè)依賴于此單元的編譯單元在#include路徑上不再無(wú)意的重復(fù)引入無(wú)關(guān)的模板庫(kù)文件。
總之一句話,我曾經(jīng)把template使用過(guò)頭?,F(xiàn)在正是reload的時(shí)候。
所以得到以下一些C++設(shè)計(jì)原則:
a. 能不用高級(jí)特性就不用高級(jí)的,其實(shí)無(wú)所謂過(guò)程式編程與OOP和范型編程的高低之分,好比是數(shù)學(xué)中的加減乘除。盡可能抑制使用template的沖動(dòng)
b. 象Loki中的Policy-Based design是非常高級(jí),以至于出現(xiàn)template<template<...>
class X, ...>的code,導(dǎo)致編譯時(shí)過(guò)長(zhǎng),由于模板天生就是內(nèi)聯(lián)語(yǔ)義,一個(gè)優(yōu)化的compiler即使在開(kāi)啟mix size選項(xiàng)時(shí),還是有太多的展開(kāi)代碼,所以編譯時(shí)長(zhǎng)長(zhǎng),程序大大。還是在確實(shí)存在設(shè)計(jì)時(shí)就可預(yù)見(jiàn)的概念互補(bǔ),可替換時(shí)使用template帶Policy-Based design。
c. 對(duì)于Template Meta Programming和Loki中使用TypeList做編譯時(shí)產(chǎn)生繼承體系的方法,個(gè)人覺(jué)得用于程序優(yōu)化很好,其實(shí)它們可以用不少現(xiàn)存的替換方案解決的,不過(guò)要學(xué)習(xí)些新東西,比如:ML,一些與c++內(nèi)嵌腳本語(yǔ)言,還有專門(mén)的指令優(yōu)化(MMX,SSE),還可以自制一個(gè)代碼生成器,或是一些預(yù)計(jì)算技術(shù)。
d. 一個(gè)不成熟的觀點(diǎn),當(dāng)用template時(shí)想想真的需要這么做嗎?回答為否。好,我該去休息10分鐘。