最終更新日時(UTC):
が更新

履歴 編集

class template
<tuple>

std::tuple_size(C++11)

namespace std {
  template <class T>
  class tuple_size;                   // (1) C++11 宣言のみで定義なし

  template <class T>
  class tuple_size<const T>;          // (2) C++11

  template <class T>
  class tuple_size<volatile T>;       // (3) C++11
                                      // C++20で非推奨

  template <class T>
  class tuple_size<const volatile T>; // (4) C++11
                                      // C++20で非推奨

  template <class... Types>
  class tuple_size<tuple<Types...>>
    : public integral_constant<size_t, sizeof...(Types)> {}; // (5) C++11

  template <class T>
  inline constexpr size_t tuple_size_v =
    tuple_size<T>::value;                                    // (6) C++17
}

概要

tuple_sizeは、タプルとして見なせる型の要素数を取得するためのクラスである。

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

  • (1) : 特殊化のための先行宣言。特殊化されていない型の場合、定義が行われないため要素数を取得しようとする段階でコンパイルエラーとなる
  • (2) : const修飾された型からも要素数を取得できるようにするための部分特殊化
  • (3) : volatile修飾された型からも要素数を取得できるようにするための部分特殊化
  • (4) : const volatile修飾された型からも要素数を取得できるようにするための部分特殊化
  • (5) : std::tupleの要素数を取得できるようにするための部分特殊化
  • (6) : 変数テンプレート版

Tがタプルと見なせない型であった場合、

  • C++11 : 仕様で明確に規定されてはいないが、直接的にコンパイルエラーとなる
  • C++17 : メンバvalueが定義されない (SFINAEと組み合わせて扱える)

非推奨の詳細

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

#include <tuple>

int main()
{
  static_assert(std::tuple_size<      std::tuple<int, int, int>>::value == 3, "");
  static_assert(std::tuple_size<const std::tuple<int, int, int>>::value == 3, "");
}

出力

バージョン

言語

  • C++11

処理系

関連項目

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

参照