在某個時刻,我們模板例項化時,可能需要對特別的型別做不同的處理。
栗子如下:
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...