Skip to content

Latest commit

 

History

History
81 lines (64 loc) · 3.25 KB

size.md

File metadata and controls

81 lines (64 loc) · 3.25 KB

size

  • ranges[meta header]
  • std::ranges[meta namespace]
  • cpo[meta id-type]
  • cpp20[meta cpp]
namespace std::ranges {
  inline namespace /*unspecified*/ {
    inline constexpr /*unspecified*/ size = /*unspecified*/;
  }
}

概要

Rangeの要素数を取得する関数オブジェクト。

効果

部分式Eの型をTtEを評価した値とする。このとき、式ranges::size(E)の効果は以下の通り。

  1. Tが配列型であれば、decay-copy(extent_v<T>)に等しい(expression‑equivalent)。ただし、要素数不明の配列であれば、呼び出しは不適格。
  2. disable_sized_range<remove_cv_t<T>>false、かつdecay-copy(t.size())が整数型(integer-like)の有効な式であれば、decay-copy(t.size())と等しい。
  3. Tがクラス型または列挙体であって、disable_sized_range<remove_cv_t<T>>false、かつsizeがADLで見つかり、decay-copy(size(t))が整数型の有効な式であれば、decay-copy(size(t))と等しい。
  4. to-unsigned-like(ranges::end(t) - ranges::begin(t))が有効な式で、ranges::beginの型Iranges::endの型Ssized_sentinel_for<S, I>forward_iteratorのモデルであれば、to-unsigned-like(ranges::end(t) - ranges::begin(t))と等しい。

どれにも当てはまらないとき、呼び出しは不適格。

戻り値

Rangeの要素数。

カスタマイゼーションポイント

ranges::beginranges::endをカスタマイズすることで、ranges::sizeをカスタマイズできる。 もしくは、メンバ関数sizeを持たせるなどの方法でカスタマイズできる。

備考

ranges::size(E)が有効な式であるとき、その型は整数型(integer-like)。

#include <vector>
#include <iostream>
#include <ranges>

int main()
{
  int arr[4] = {};
  std::cout << std::ranges::size(arr) << std::endl;

  std::cout << std::ranges::size(u8"arikitari") << std::endl;

  std::vector<int> v = { 1,1,2,3,5,8 };
  int hoge = 13;
  v.push_back(hoge);
  std::cout << std::ranges::size(v) << std::endl;
}
  • std::ranges::size[color ff0000]

出力

4
10
7

バージョン

言語

  • C++20

処理系

  • Clang: 13.0.0 [mark verified]
  • GCC: 10.1.0 [mark verified]
  • ICC: ?
  • Visual C++: 2019 Update 10 [mark verified]

関連項目

参照