Skip to content

Latest commit

 

History

History
85 lines (63 loc) · 3.11 KB

tuple_size.md

File metadata and controls

85 lines (63 loc) · 3.11 KB

tuple_size

  • tuple[meta header]
  • std[meta namespace]
  • class template[meta id-type]
  • cpp11[meta cpp]
namespace std {
  template <class T> class tuple_size; // 宣言のみで定義なし

  template <class T> class tuple_size<const T>;
  template <class T> class tuple_size<volatile T>;
  template <class T> class tuple_size<const volatile T>;

  template <class... Types>
  class tuple_size<tuple<Types...>>
    : public integral_constant<size_t, sizeof...(Types)> {};

  template <class T>
  inline constexpr size_t tuple_size_v = tuple_size<T>::value; // C++17
}
  • tuple[link tuple.md]
  • integral_constant[link /reference/type_traits/integral_constant.md]

概要

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

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

  • template <class T> class tuple_size;

    特殊化のための先行宣言。特殊化されていない型の場合、定義が行われないため要素数を取得しようとする段階でコンパイルエラーとなる。

  • template <class T> class tuple_size<const T>;

  • template <class T> class tuple_size<volatile T>;

  • template <class T> class tuple_size<const volatile T>;

    CV修飾された型からも要素数を取得できるようにするための部分特殊化。

  • template <class... Types> class tuple_size<tuple<Types...>>;

    std::tupleの要素数を取得できるようにするための部分特殊化。

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

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

#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, "");
  static_assert(std::tuple_size<volatile       std::tuple<int, int, int>>::value == 3, "");
  static_assert(std::tuple_size<const volatile std::tuple<int, int, int>>::value == 3, "");
}
  • std::tuple_size[color ff0000]
  • std::tuple[link tuple.md]

出力

バージョン

言語

  • C++11

処理系

参照