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

履歴 編集

customization point object
<ranges>

std::ranges::size(C++20)

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;
}

出力

4
10
7

バージョン

言語

  • C++20

処理系

関連項目

参照