本文所有的例證**在reactos-0.3.14\include\c++\stlport\type_traits有所展示,這是reactos專案中的stl庫檔案
編譯期assertion:
template
to safe_reinterpret_cast(from from)
要保證轉型時安全的,那麼必須保證大的型別不能夠轉化為小的型別,上式提供了斷言方式,在執行期作用。
如果我們需要保證在編譯器就可以發現問題,那麼需要另外一種更為巧妙的方法
#define static_check(
expr)
那麼上面的安全轉型檢測將可以改寫成下面這種方式:
template
to safe_reinterpret_cast(from from)
當然這個式子成立的前提是大小為
0的陣列要給出報錯。下面更進一步,利用
c++當中的模板來優化
static_check
。在這裡要提兩個概念:
nullclass
和emptyclass
。nullclass
表示只有宣告而沒有定義的類,而
emptyclass
的定義是既沒有成員變數也沒有成員函式(注意這時的
emptyclass
的大小並不是
0,而是1)。
templatestruct compiletimeerror;
template<> truct compiletimeerror{};
static_check(expr) (compiletimeerror)
這裡,如果
static_check
裡面的引數估值為真的時候,那麼憂鬱偏特化會生成乙個
emptyclass
,但是如果估值為假的時候,則會生成乙個
nullclass
的例項,而這是不允許的,所以要報錯。
當然還可以更進一步將
static_check
進行改造如下。
templatestruct compiletimeerror ;
template<> truct compiletimeerror{};
static_check(expr,msg) ;\ (
void*
)sizeof(compiletimeerror(error##msg()));\ }
(void
)sizeof(compiletimeerror(error##msg()));
這一句本意並不是為了求大小,而是為了強制將
error##msg
臨時構造初來的例項轉化為
templatecompiletimeerror
物件(否則無用語句可能被編譯器優化掉),同時因為
sizeof
不是函式,所以實際
sizeof
當中的式子並未被求值。由於
template<> truct compiletimeerror
類沒有建構函式進行有效的轉換,所以會報錯。
型別對映為型別
templatestruct int2type}
很明顯在這裡
int2type<0>
和int2type<1>
是不同的型別。更近一步看乙個類向其他類的轉換。
templatestruct type2type很明顯,這裡實現了型別到型別的對映。當然這些加上偏特化就可以發揮威力了。例如:
template
class notifycontainer
void dosomething(t* pobj,int2type)
public:
void dosomething(t* pobj)
} 這樣的情況同樣也適用於type2type的情況,當然也不必擔心內部的函式過多會增加程式的大小,編譯器會自動優化掉那些沒有生成的函式以及類。
編譯期間的繼承偵測
template
struct conversation;
static small test(u);
static t maket();
static big test(…);
enum; }
最後的exit
的取值如之前分析的,在三種情況下
exit
的值等於
1,第一t和
u是同一型別,第二u是
t的基類,第三t是
void。
C 設計新思維 pdf格式
侯捷 於春景 合譯 c 設計新思維泛型程式設計與設計正規化 之 應用 前三章內容簡介如下 第 篇 技術 techniques 1 第1章以policy為基礎的class設計 policy based class design 3 1.1 軟體設計的多樣性 multiplicity 3 1.2 全功能...
C 設計新思維的traits和policy
這篇部落格講得挺清楚的,本來想自己寫寫看總結下的,不過看了下這個文章已經寫得很清楚了,倒沒有必要了,總得來說,要了解traits和policy,需要了解下面這三個點 1.什麼是特化,什麼是偏特化 顧名思義,特化就是針對一些特殊的型別進行變化,畢竟c 的模板是什麼型別都能放進去的,但是有些型別就是比較...
《C 設計新思維》評價和勘誤及問題
c 設計新思維 評價和勘誤及問題 advanced c design 的中譯本 andrei alexandrescu 著侯捷 於春景譯 華中科技大學出版社 這本書後面時間的緣故,已經沒有認真,因此本文章僅大致作為記錄,謝絕參考!評價 書的內在是一本好書,講了很多的設計策略和如何使用模板來進行設計。...