最終更新日時: 2025年07月12日 02時16分44秒 (JST)
Koichi Murase が更新

履歴 編集

class template
<type_traits>

# std::enable_if(C++11)

    namespace std {
      template <bool Condition, class T = void>
      struct enable_if;

      template <bool Condition, class T = void>
      using enable_if_t = typename enable_if<Condition,T>::type; // C++14
    }

## 概要

コンパイル時条件式が真の場合のみ有効な型。

## 効果

`enable_if`は、`Condition`が`true`の場合のみ、型`T`をメンバ型`type`として定義する。そうでなければ`enable_if`は、メンバ型`type`を持たない。

`enable_if`は、SFINAEと組み合わせて使用する。関数のパラメータ、戻り値型、デフォルトテンプレートパラメータ等のいずれかで`enable_if`のメンバ型`type`を使用することにより、テンプレートの置き換え失敗が発生し、SFINAEによってその関数がオーバーロード解決の候補から除外される。

## 例

    #include <type_traits>
    #include <iostream>

    template <class T>
    auto f(T) -> typename std::enable_if<std::is_integral<T>::value>::type
    {
      std::cout << "Tは整数型" << std::endl;
    }

    template <class T>
    auto f(T) -> typename std::enable_if<!std::is_integral<T>::value>::type
    {
      std::cout << "Tは整数型以外" << std::endl;
    }

    int main()
    {
      f(3);
      f("hello");
    }

### 出力

    Tは整数型
    Tは整数型以外

## バージョン

### 言語

- C++11

### 処理系

- Clang: 3.0 ✅
- GCC: 4.3.6 ✅
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅
  - `enable_if_t`は、2013から。

## 参照

- N2240 Two missing traits: `enable_if` and `conditional`
- N3546 TransformationTraits Redux
- N3655 TransformationTraits Redux, v2