你知道,當一個概念從一個專有名詞變成一個普通名詞時,說明它真正的深入人心了。比如Kleenex(面巾紙品牌,也指面巾紙),Xerox(施樂,復印機品牌,也指復印機)Q-Tips(化妝品品牌,也指化妝包),對嗎?所以說,當我聽說你可以在Visual C++.NET中使用“modern C++ design”時非常興奮也就不希奇了。這里指的是——至少我這樣認為——《Modern C++ Design》[1]所推行的基于模板的技術。
template <class E, class A, class T> inline T& Enforce(T& obj, A arg) { if (!obj) throw E(arg); return obj; }
template <class E, class A, class T> inline const T& Enforce(const T& obj, A arg) { if (!obj) throw E(arg); return obj; } (兩個版本是必須的,分別對應const和非const對象。)你可以增加兩個重載版本來表示你通常會拋出的那種意外和它所帶參數。
Widget* pWidget = MakeWidget (); ENFORCE(pWidget)(“This widget is null and it shouldn’t!”); 此處當Enforcer對象被創建后,operator()被調用。該操作要么把傳入信息添加到msg_成員變量中,要么假如pWidget非空即無錯誤出現就忽略所有。換句話說,正常執行路徑與帶一個檢測的執行路徑執行得一樣快。這就是漂亮的地方——真正的工作只在發生錯誤的情況才做,
int n = …; Widget* pWidget = MakeWidget(n); ENFORCE(pWidget)(“Widget number “)(n)(“ is null and it shouldn’t!”); 我們不知道你感覺如何,反正我們對這個設計十分的滿足。反過來說,誰會不喜歡一個簡明的,富于表達力的,并且是高效的解決方案呢? 定制判定和拋出策略
[1] A. Alexandrescu. Modern C++ Design (Addison-Wesley Longman, 2001). [2] Andrei Alexandrescu and Petru Marginean. "Simplify your Exception-Safe Code" [3] 預備不足意思是讓一名程序員接手先天不足的具體設計。 [4] Andrei Alexandrescu. "Assertions" [5] 這個規范看上去很好。但不知什么原因演變成舊規范。在COM世界中,S_TRUE是零,S_FALSE是1。不要忽略這個信息! [6] http://www.jaggersoft.com/pubs/CVu10_1.Html