Modern C++ Design(MCD)學習筆記 && 測試代碼(一)
MCD里面給我們展現(xiàn)了許多高階的C++ template技巧,大部分都是天才級別的人才能想出來的,與此同時,這些技巧也稍顯前衛(wèi)了,至少根據(jù)我對國內(nèi)C++程序員的了解,能把STL玩的很好的已經(jīng)少見了,并且里面的大部分技巧是在“挑戰(zhàn)編譯器”。
但是,我還是決定好好把這本書看完,一邊看一邊摘錄書中以及l(fā)oki庫中的代碼進行測試,權(quán)當開闊自己的視野。
一.compile assert編譯器斷言技巧
//?以下是書中的代碼
template<bool>?struct?CompileTimeError;

template<>?struct?CompileTimeError<true>
{};

#define?STATIC_CHECK(expr)??\
????(CompileTimeError<?(expr)?!=?0>()?)

template<bool>?struct?CompileTimeChecker


{
????CompileTimeChecker(
);
};


template<>?struct?CompileTimeChecker<false>?
{};

#define?STATIC_CHECK_MSG(expr,?msg)?\

????
{\

????????class?ERROR_##msg?
{};\
????????(void)sizeof(CompileTimeChecker<(expr)>?(ERROR_##msg()));\
????}

//?以下是loki中的代碼
namespace?Loki


{
????template<int>?struct?CompileTimeError;

????template<>?struct?CompileTimeError<true>?
{};
}

#define?STATIC_CHECK_LOKI(expr,?msg)?\


{?Loki::CompileTimeError<((expr)?!=?0)>?ERROR_##msg;?(void)ERROR_##msg;}?

int?main(int?argc,?char?*argv[])


{
????//?gcc不能編譯,VC7編譯通過
????STATIC_CHECK(1);
????//?gcc,VC7都不能編譯
????//STATIC_CHECK_MSG(1,?Error_Msg);
????//?gcc,VC7都能編譯
????STATIC_CHECK_LOKI(1,?Error_Msg);

????return?0;
}


這個東東的技巧在于:定義一個模版類,這個模版的模版參數(shù)是bool類型,對true的特化模版類進行了定義,而false的特化類沒有定義,在使用的時候把需要斷言的表達式作為模版參數(shù)來初始化這個模版類,如果為false,因為false的特化類沒有定義,此時編譯器會報錯。
注意:這里的斷言是在編譯期進行的,與一般的運行時斷言有區(qū)別。
未完待續(xù)....
但是,我還是決定好好把這本書看完,一邊看一邊摘錄書中以及l(fā)oki庫中的代碼進行測試,權(quán)當開闊自己的視野。
一.compile assert編譯器斷言技巧






























































這個東東的技巧在于:定義一個模版類,這個模版的模版參數(shù)是bool類型,對true的特化模版類進行了定義,而false的特化類沒有定義,在使用的時候把需要斷言的表達式作為模版參數(shù)來初始化這個模版類,如果為false,因為false的特化類沒有定義,此時編譯器會報錯。
注意:這里的斷言是在編譯期進行的,與一般的運行時斷言有區(qū)別。
未完待續(xù)....
posted on 2007-02-04 15:53 那誰 閱讀(1681) 評論(1) 編輯 收藏 引用 所屬分類: C\C++