學習boost模板程式設計 判斷兩個型別是否相同

2021-06-03 04:54:00 字數 1364 閱讀 2561

boost/type_traits/is_same.hpp中的is_same模板,用於判斷兩個型別是否完全相同。

首先,試一下下面函式的作用

template

bool is_same_tester(t*, t*)

bool is_same_tester(...)

int a; char b;

bool c = is_same_tester(&a,&b); 返回false,即使是繼承關係的類也被認為不同

bool c = is_same_tester(&a,&a); 返回true,只要是同型別都會返回true,即使用typedef改名稱了也被認為是同一型別

但是,上面的方法只能在執行時生效,不能在編譯是生效。在編譯時生效的話,可以生成不同的**。boost用得最多的是在編譯時判斷兩個型別是否相同,不同的話提前報編譯錯誤,避免用錯誤的引數例項化模板,浪費編譯時間,也浪費找編譯錯誤的時間。

在不支援部分特化的編譯器上,可以用此方法實現部分特化。

為了在編譯時生效,只能用編譯時起作用的方法,編譯時起作用的有常量的基本運算,sizeof等。

boost讓函式is_same_tester返回不同的yes_type和no_type,這兩個型別的sizeof結果不相等,不用關心它們的具體定義,再判斷返回型別的大小。注意兩個函式沒有實現體,即編譯後不會生成任何**。

template

yes_type is_same_tester(t*, t*);

:no_type is_same_tester(...);

sizeof(yes_type) == sizeof( is_same_tester(&a,&b) ) 就變成編譯時就能算出結果的布林常量

看乙個boost裡面的應用,enable_if和disable_if,則兩個東西用在函式的引數中,讓函式編譯不過。使用舉例

void f (a a, b b, typename enable_if>::type * = 0)

當型別a和b相同時,enable_if::type定義成void;當a和b型別不同時,enable_if::type沒有定義,導致編譯報錯。

具體實現如下

template

struct enable_if_c ;

template

struct enable_if_c{};  // 特化,條件為假時,沒有定義type

// 下面兩個模板,將is_same關聯到一起

template

struct enable_if : public enable_if_c{};

template

struct disable_if : public enable_if_c {};

如果編譯器支援部分特化,實現起來更簡單

程式設計判斷兩個鍊錶是否相交

程式設計之美 3.6節 判斷兩個鍊錶是否相交 問題 給出兩個單項鍊表的頭指標,判斷這兩個鍊錶是否相交,假設都不帶環。解法 遍歷第乙個鍊錶至尾節點,然後遍歷第二個鍊錶,如果尾節點和剛才相同,則說明相交,否則不想交。includeusing namespace std struct node bool ...

判斷兩個線段相交

我們首先將問題分成如下幾個小問題討論 首先要解決的第乙個問題是判斷直線是否平行,我們首先假設四個點的座標為 前兩個點為a x1,y1 b x2,y2 後兩個點為 c x3,y3 d x4,y4 求出兩個直線的方向向量e1 x 1 x2 y1 y2 e2 x 3 x4 y3 y4 通過e 1 e2 求...

3 6 程式設計判斷兩個鍊錶是否相交

一 題目 輸入乙個單項鍊表,找出該鍊錶的倒數第k個節點。解法 設立兩個指標,先讓第乙個指標先往前走k步,然後第二個指標放到鍊錶開頭。然後兩個鍊錶一起往後走,當第乙個鍊錶到達鍊錶尾部的時候,後面那個鍊錶所在的位置就剛好是鍊錶的倒數第k個節點!struct node node funtion node ...