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
竟然是 0
(false
)。觀察一下具現化過程,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。
<< 回到主頁