c 模板例項化型別判斷 編譯期錯誤丟擲

2021-10-25 19:42:28 字數 2065 閱讀 1670

在某個時刻,我們模板例項化時,可能需要對特別的型別做不同的處理。

栗子如下:

if

constexpr

(std::is_same_vfloat

>

)else

備註:「if constexpr」 為c++17特性,其他分支判斷方法,見後面分支判斷說明

也許某個時刻,我們的模板中,不支援特定型別的處理,在編譯器就報錯,好讓程式猿的我們,不在苦苦查詢bug。

栗子如下:

static_assert

(std::is_arithmetic_v

,"type is self define type"

)

std::is_integral_v 		//是否為整型判斷

std::is_class_v //是否為類判斷

std::is_function_v //是否為函式判斷

即匹配失敗不是錯誤,英文substitution failure is not an error

template

<

typename t>

std::enable_if_t

, t>

******typeinfo

(t t)

template

<

typename t>

std::enable_if_t<

not std::is_integral_v

, t>

******typeinfo

(t t)

template

<

typename t>

t ******typeinfotagimpl

(t t, std::true_type)

template

<

typename t>

t ******typeinfotagimpl

(t t, std::false_type)

template

<

typename t>

t ******typeinfotag

(t t));

}

template

<

typename t>

t ******typeinfo

(t t)

else

return t;

}

int a =15;

a str;

const

char

*p =

"world"

; cout <<

"hello world!"

<< endl;

// 直接輸出型別名稱

cout <<

typeid

(int).

name()

<< endl;

// 輸出變數a的型別名稱

cout <<

typeid

(a).

name()

<< endl;

// 輸出結構體str的型別

cout <<

typeid

(str)

.name()

<< endl;

// 輸出計算結果的型別

cout <<

typeid

(1.23

*3.4).

name()

<< endl;

// 輸出字串的型別

cout <<

typeid

("hello").

name()

<< endl;

// 輸出指標型別

cout <<

typeid

(p).

name()

<< endl;

C 模板例項化

例項化 乙個通過使用具體值替換模板引數,從模板產生的普通類,函式或者成員函式的過程。特化 就是上述過程最終獲得實體。延遲例項化 當隱式例項化類模板時,同時也例項化了該模板的每個成員宣告,但並沒有例項化相應的定義,然而,存在例外 1.如果類模板包含了乙個匿名的union,那麼該union定義的成員同時...

C 之模板例項化

模板可以分為類模板與函式模板,它們的宣告形式分別為 templateclass 類名 template返回值型別 函式名 形參表 其中typename後跟的是型別引數,可以是內建型別,也可以是自定義型別,像size這種為非型別引數,為固定值。模板在沒有被例項化的情況下是不會生成二進位制 的,其實例化...

C 函式模板 模板例項化 具體化

函式模板是c 新增的一種性質,它允許只定義一次函式的實現,即可使用不同型別的引數來呼叫該函式。這樣做可以減小 的書寫的複雜度,同時也便於修改 注 使用模板函式並不會減少最終可執行程式的大小,因為在呼叫模板函式時,編譯器都根據呼叫時的引數型別進行了相應例項化 下面來看看函式模板的使用過程 struct...