namespace std::ranges {
inline namespace /*unspecified*/ {
inline constexpr /*unspecified*/ size = /*unspecified*/;
}
}
概要
Rangeの要素数を取得する関数オブジェクト。
効果
部分式E
の型をT
、t
をE
を評価した値とする。このとき、式ranges::size(E)
の効果は以下の通り。
T
が配列型であれば、decay-copy(extent_v<T>)
に等しい(expression‑equivalent)。ただし、要素数不明の配列であれば、呼び出しは不適格。disable_sized_range<remove_cv_t<T>>
がfalse
、かつdecay-copy(t.size())
が整数型(integer-like)の有効な式であれば、decay-copy(t.size())
と等しい。T
がクラス型または列挙体であって、disable_sized_range<remove_cv_t<T>>
がfalse
、かつsize
がADLで見つかり、decay-copy(size(t))
が整数型の有効な式であれば、decay-copy(size(t))
と等しい。to-unsigned-like(ranges::end(t) -ranges::begin(t))
が有効な式で、ranges::begin
の型I
、ranges::end
の型S
がsized_sentinel_for<S, I>
とforward_iterator
のモデルであれば、to-unsigned-like(ranges::end(t) -ranges::begin(t))
と等しい。
どれにも当てはまらないとき、呼び出しは不適格。
戻り値
Rangeの要素数。
カスタマイゼーションポイント
ranges::begin
とranges::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;
}
17
#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
処理系
- Clang: 13.0.0 ✅
- GCC: 10.1.0 ✅
- ICC: ?
- Visual C++: 2019 Update 10 ✅