2006/08/29

CRTP 檢驗問題

我寫了這樣的程式碼模擬下面那篇文章所說的 static_assert

 1: #include <tr1/type_traits>
 2: #include <iostream>
 3: 
 4: using namespace std;
 5: 
 6: template <bool>
 7: struct static_assert;
 8: 
 9: template <>
10: struct static_assert<true> { };
11: 
12: template <typename T>
13: class CRTPbase
14:   : static_assert< tr1::is_base_of<CRTPbase<T>, T>::value > {
15:   // ...
16: };
17: 
18: class C : public CRTPbase<C> {
19:   // ...
20: };
21: 
22: int main() {
23:   // ...
24: }

不過編譯結果顯示,tr1::is_base_of<CRTPbase<C>, C>::value 竟然是 0false)。觀察一下具現化過程,L18 首先意圖具現化 CRTPbase<C>,從而意圖具現化 static_assert base struct,最後是作為前者 template 引數的 tr1::is_base_of<CRTPbase<C>, C>。此時可能是因為 class C 和「具現中的 CRTPbase<C>」之間的繼承關係尚未搭起(畢竟 base class 還沒生出來),所以使得 static_assert 具現失敗。唔,有解嗎?

--
HTML 對於 template code 真是太不友善了 XD。