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