最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<variant>

# std::variant_size(C++17)

    namespace std {
      template <class T>
      struct variant_size;                   // (1) C++17 先行宣言

      template <class T>
      struct variant_size<const T>;          // (2) C++17

      template <class T>
      struct variant_size<volatile T>;       // (3) C++17
                                             // C++20で非推奨

      template <class T>
      struct variant_size<const volatile T>; // (4) C++17
                                             // C++20で非推奨

      template <class T>
      inline constexpr size_t variant_size_v
        = variant_size<T>::value;            // (5) C++17

      template<class... Types>
      struct variant_size<variant<Types...>>
        : integral_constant<std::size_t, sizeof...(Types)> {}; // (6) C++17
    }

## 概要

`variant_size`は、`std::variant`クラスの候補型の数を取得するためのクラスである。

要素数は、`integral_constant`の機能を利用してコンパイル時の定数値として取得できる。

- (1) : 先行宣言
- (2) : `const`修飾付きの`std::variant`型の、候補型の数を取得する
- (3) : `volatile`修飾付きの`std::variant`型の、候補型の数を取得する
- (4) : `const volatile`修飾付きの`std::variant`型の、候補型の数を取得する
- (5) : 変数テンプレート版
- (6) : 修飾なしの`std::variant`型の、候補型の数を取得する

## 非推奨の詳細

- (3), (4) : これらの部分特殊化は、型の`volatile`修飾を部分的に非推奨にすることにともなって、非推奨化される

## 例

    #include <variant>
    #include <string>

    int main()
    {
      // (6) CV修飾なしのstd::variant型の、候補型 (int, std::string, double) の数を取得する
      static_assert(std::variant_size<
        std::variant<int, std::string, double>
      >::value == 3);

      // (2) const修飾付きのstd::variant型の、候補型の数を取得する
      static_assert(std::variant_size<
        const std::variant<int, std::string, double>
      >::value == 3);

      // (5) 変数テンプレート版
      static_assert(std::variant_size_v<
        std::variant<int, std::string, double>
      > == 3);
    }

### 出力

## バージョン

### 言語

- C++17

### 処理系

- Clang: 4.0 ✅
- GCC: 7.3 ✅
- Visual C++: ??

## 関連項目

- C++20 ほとんどの`volatile`を非推奨化

## 参照

- P1831R1 Deprecating `volatile`: library