C 設計新思維(1)

2021-06-21 21:26:18 字數 2241 閱讀 8629

本文所有的例證**在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 著侯捷 於春景譯 華中科技大學出版社 這本書後面時間的緣故,已經沒有認真,因此本文章僅大致作為記錄,謝絕參考!評價 書的內在是一本好書,講了很多的設計策略和如何使用模板來進行設計。...