3.3.4. pfi::lang::enable_if¶
3.3.4.1. 概要¶
template <bool B_, class T = void>
using enable_if = std::enable_if<B_, T>;
template <bool B_, class T = void>
struct disable_if : enable_if<!B_, T> {};
コンパイル時、 B_
がtrueであれば type
メンバを持つ enable_if
、 falseであれば type
メンバを持つ disable_if
を提供する。
3.3.4.2. 使い方¶
template <class T>
auto f(T) -> typename pfi::lang::enable_if<std::is_integral<T>::value>::type {}
関数の引数や戻り値、テンプレート引数のデフォルト値などで enable_if
や diable_if
の type
メンバを使用すると、 SFINAEにより type
メンバが存在しない場合はその関数はオーバーロード解決の対象から除外される。
3.3.4.3. サンプルコード¶
template <class T>
auto f(T) -> typename pfi::lang::enable_if<std::is_integral<T>::value>::type
{
std::cout << "Tは整数型" << std::endl;
}
template <class T>
auto f(T) -> typename pfi::lang::disable_if<std::is_integral<T>::value>::type
{
std::cout << "Tは整数型以外" << std::endl;
}
f(3); // Tは整数型
f("hello"); // Tは整数型以外