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 ...