- 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
の型を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;
}
- 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]