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_ifdiable_iftype メンバを使用すると、 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は整数型以外