編譯期多型和Sfinae

2022-07-31 21:12:17 字數 1657 閱讀 6201

一旦型別匹配成功,模板就會被例項化,如果在模板函式內部發生了編譯錯誤,編譯會失敗!,也就是說,模板一旦例項化,sfinae就無法讓錯誤再被忽略了

template class is_class

;

觸發sfinae機制,可以使用enable_if_t模板使得某些模板在編譯期不展開,實現一定的編譯期多型的功能,例子如下:

// 這樣只是保證了有sort名字的函式而已

//對函式的簽名並沒有要求

template class hassort ;

template class hasreserve ;

struct bad ;

// 用兩個模板引數保證了sort(size_t)一定是來自於container的

template class sfinae;

// 匹配test時,要先匹配sfinae,匹配sfinae就必須要求u有帶size_t的reserve函式

template static good test(sfinae*); // 這裡總要傳個什麼作為形參,就傳指標好了

template static bad test(...); // 如果第乙個匹配失敗了,就匹配這個

public:

const static bool value = sizeof(test(nullptr)) == sizeof(good);

};template std::enable_if_t::value, void>

bestreserve(container &c, size_t s)

template std::enable_if_t::value, void>

bestreserve(container& c, size_t s)

template std::enable_if_t::value, void>

bestsort(container& c)

template std::enable_if_t::value, void>

bestsort(container& c)

struct foo

};struct bar

};int main()

對於任意型別,如果它有sort方法,在bestsort裡就優先呼叫它,如果沒有再做其他處理,比如呼叫全域性的sort,但是注意這裡使用函式簽名來匹配成員函式,好像沒辦法支援對函式引數型別的匹配;

對於任意型別,如果它有reserve方法,在bestreserve裡就優先呼叫它,如果沒有再做其他處理,比如呼叫全域性的reserve,注意這裡的reserve是帶引數的,所以要做特殊處理(見class sifnae);

此外enable_if_t的定義是:

template< bool b, class t = void >

using enable_if_t = typename enable_if::type;

templatestruct enable_if;

templatestruct enable_if {};

實際上就是如果傳入的bool值時false的話,這個type就不存在,編譯期的模板匹配就會失敗,可以借助這個特性達到一定的編譯期多型的功能。

編譯期多型和執行期多型

所謂的多型是通過乙個單一的識別符號支援不同的特定行為的能力。靜態多型 編譯期多型 動態多型 執行期多型 虛函式過載 模板 轉換 型別別名 今天我們就只討論從繫結時間來分的多型種類,即編譯期多型和執行期多型。執行期多型可以說只要學了c 的人都是知道的。因為執行期多型就是我通俗所說的多型,它的提出可以歸...

編譯期多型和執行期多型

執行期多型 runtime polymorphism 也稱為顯式多型,是指類中成員函式是virtual,類將對這些函式表現出執行期多型,也就是說將於執行期根據基類指標或者引用的動態型別決定究竟呼叫哪乙個函式。編譯期多型 cmpile time polymorphisms 也稱為隱式多型,是指以不同的...

C 的執行期多型和編譯期多型

今日的c 不再是個單純的 帶類的c 語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c 發展中最為出彩的那部分。在物件導向c 程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式設計中,多型基於template 模板 的具現化與...