Skip to content

Commit eb2177a

Browse files
committed
single_view : メンバ関数を追加 #713
1 parent 2c26002 commit eb2177a

File tree

8 files changed

+403
-11
lines changed

8 files changed

+403
-11
lines changed

reference/ranges/single_view.md

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ namespace std::ranges {
99
template<copy_constructible T>
1010
requires is_object_v<T>
1111
class single_view : public view_interface<single_view<T>> { …… }; // (1) C++20
12-
1312
template<move_constructible T>
1413
requires is_object_v<T>
1514
class single_view : public view_interface<single_view<T>> { …… }; // (1) C++23
@@ -30,23 +29,37 @@ namespace std::ranges {
3029
|----------|-------|--------|-------|---------|---------------|---------------|------------|--------|----------|------|
3130
| | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
3231
32+
## テンプレートパラメータ制約
33+
- (1) :
34+
- C++20 : 型`T`がコピー構築可能であること
35+
- C++23 : 型`T`がムーブ構築可能であること
36+
37+
3338
## 効果
3439
- 式`views::single(E)`の効果は`single_view<decay_t<decltype((E))>>(E)`と等しい。
3540
41+
## メンバ変数
42+
43+
| 名前 | 説明 | 対応バージョン |
44+
|---------------------------------------------|--------------|-----------------------|
45+
| [`movable-box`](movable_box.md)`<T> value_` | 単一要素の値 | C++20 |
46+
47+
3648
## メンバ関数
3749
3850
| 名前 | 説明 | 対応バージョン |
3951
|--------------------------------------------------|----------------------------------|----------------|
40-
| [`(constructor)`](single_view/op_constructor.md.nolink) | コンストラクタ | C++20 |
41-
| [`begin`](single_view/begin.md.nolink) | 先頭を指すイテレータを取得する | C++20 |
42-
| [`end`](single_view/end.md.nolink) | 番兵を取得する | C++20 |
43-
| [`data`](single_view/data.md.nolink) | 配列の先頭へのポインタを取得する | C++20 |
52+
| [`(constructor)`](single_view/op_constructor.md) | コンストラクタ | C++20 |
53+
| [`begin`](single_view/begin.md) | 先頭を指すイテレータを取得する | C++20 |
54+
| [`end`](single_view/end.md) | 番兵を取得する | C++20 |
55+
| [`data`](single_view/data.md) | 配列の先頭へのポインタを取得する | C++20 |
4456
4557
## 静的メンバ関数
4658
47-
| 名前 | 説明 | 対応バージョン |
48-
|--------------------------------------------------|----------------------------------|----------------|
49-
| [`size`](single_view/size.md.nolink) | 要素数を取得する | C++20 |
59+
| 名前 | 説明 | 対応バージョン |
60+
|---------------------------------|-----------------------------|----------------|
61+
| [`size`](single_view/size.md) | 要素数を取得する | C++20 |
62+
| [`empty`](single_view/empty.md) | Rangeが空かどうかを判定する | C++20 |
5063
5164
## 継承しているメンバ関数
5265
@@ -56,12 +69,14 @@ namespace std::ranges {
5669
| [`front`](view_interface/front.md) | 先頭要素への参照を取得する | C++20 |
5770
| [`back`](view_interface/back.md) | 末尾要素への参照を取得する | C++20 |
5871
| [`operator[]`](view_interface/op_at.md) | 要素へアクセスする | C++20 |
72+
| [`cbegin`](view_interface/cbegin.md) | 定数イテレータを取得する | C++23 |
73+
| [`cend`](view_interface/cend.md) | 定数イテレータ(番兵)を取得する | C++23 |
5974
6075
## 推論補助
6176
62-
| 名前 | 説明 | 対応バージョン |
63-
|-------------------------------------------------------|------------------------------|----------------|
64-
| [`(deduction_guide)`](single_view/op_deduction_guide.md.nolink) | クラステンプレートの推論補助 | C++20 |
77+
| 名前 | 説明 | 対応バージョン |
78+
|----------------------------------------------------------|------------------------------|----------------|
79+
| [`(deduction_guide)`](single_view/op_deduction_guide.md) | クラステンプレートの推論補助 | C++20 |
6580
6681
## 例
6782
```cpp example
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# begin
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* single_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr T* begin() noexcept; // (1) C++20
10+
constexpr const T* begin() const noexcept; // (2) C++20
11+
```
12+
13+
## 概要
14+
`view`の先頭要素を指すイテレータを取得する。
15+
16+
## 戻り値
17+
以下と等価:
18+
19+
```cpp
20+
return data();
21+
```
22+
* data()[link data.md]
23+
24+
25+
##
26+
27+
```cpp example
28+
#include <iostream>
29+
#include <ranges>
30+
31+
int main() {
32+
auto r = std::views::single(1);
33+
int* it = r.begin();
34+
int* last = r.end();
35+
36+
for (; it != last; ++it) {
37+
std::cout << *it << std::endl;
38+
}
39+
}
40+
```
41+
* begin[color ff0000]
42+
* end[link end.md]
43+
44+
### 出力
45+
46+
```
47+
1
48+
```
49+
50+
## バージョン
51+
### 言語
52+
- C++20
53+
54+
### 処理系
55+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
56+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
57+
- [ICC](/implementation.md#icc): ?
58+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# data
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* single_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr T* data() noexcept; // (1) C++20
10+
constexpr const T* data() const noexcept; // (2) C++20
11+
```
12+
13+
## 概要
14+
配列の先頭へのポインタを取得する。
15+
16+
## 戻り値
17+
以下と等価:
18+
19+
```cpp
20+
return value_.operator->();
21+
```
22+
23+
24+
##
25+
26+
```cpp example
27+
#include <iostream>
28+
#include <ranges>
29+
30+
int main() {
31+
auto r = std::views::single(1);
32+
int* p = r.data();
33+
34+
std::cout << *p << std::endl;
35+
}
36+
```
37+
* data[color ff0000]
38+
39+
### 出力
40+
41+
```
42+
1
43+
```
44+
45+
## バージョン
46+
### 言語
47+
- C++20
48+
49+
### 処理系
50+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
51+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
52+
- [ICC](/implementation.md#icc): ?
53+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# empty
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* single_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
static constexpr bool empty() noexcept; // (1) C++20
10+
```
11+
12+
## 概要
13+
Rangeが空かどうかを判定する。
14+
15+
## 戻り値
16+
17+
```cpp
18+
return false;
19+
```
20+
21+
22+
## バージョン
23+
### 言語
24+
- C++20
25+
26+
### 処理系
27+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
28+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
29+
- [ICC](/implementation.md#icc): ?
30+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# end
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* single_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
constexpr T* end() noexcept; // (1) C++20
10+
constexpr const T* end() const noexcept; // (2) C++20
11+
```
12+
13+
## 概要
14+
15+
番兵を取得する。
16+
17+
## 戻り値
18+
以下と等価:
19+
20+
```cpp
21+
return data() + 1;
22+
```
23+
* data()[link data.md]
24+
25+
26+
##
27+
28+
```cpp example
29+
#include <iostream>
30+
#include <ranges>
31+
32+
int main() {
33+
auto r = std::views::single(1);
34+
int* it = r.begin();
35+
int* last = r.end();
36+
37+
for (; it != last; ++it) {
38+
std::cout << *it << std::endl;
39+
}
40+
}
41+
```
42+
* end[color ff0000]
43+
* begin[link begin.md]
44+
45+
### 出力
46+
47+
```
48+
1
49+
```
50+
51+
## バージョン
52+
### 言語
53+
- C++20
54+
55+
### 処理系
56+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
57+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
58+
- [ICC](/implementation.md#icc): ?
59+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# コンストラクタ
2+
* ranges[meta header]
3+
* std::ranges[meta namespace]
4+
* single_view[meta class]
5+
* function[meta id-type]
6+
* cpp20[meta cpp]
7+
8+
```cpp
9+
single_view()
10+
requires default_initializable<T> = default; // (1) C++20
11+
12+
constexpr explicit single_view(const T& t)
13+
requires copy_constructible<T>; // (2) C++20
14+
15+
constexpr explicit single_view(T&& t); // (3) C++20
16+
17+
template <class... Args>
18+
requires constructible_from<T, Args...>
19+
constexpr explicit single_view(in_place_t, Args&&... args); // (4) C++20
20+
```
21+
22+
## 概要
23+
[`single_view`](../single_view.md)オブジェクトを構築する。
24+
25+
- (1) : デフォルト構築
26+
- (2) : `t`をコピーして、`*this`に保持する
27+
- (3) : `t`をムーブして、`*this`に保持する
28+
- (4) : 型`T`のコンストラクタ引数`args...`を転送して`T`型オブジェクトを内部で構築し、`*this`に保持する
29+
30+
31+
## テンプレートパラメータ制約
32+
- (1) : 型`T`がデフォルト構築可能であること
33+
- (2) : 型`T`がコピー構築可能であること
34+
- (4) : 型`T`が`Args...`で構築可能であること
35+
36+
37+
## 効果
38+
39+
- (2) : `value_`を`t`で初期化する
40+
- (3) : `value_`を[`std::move`](/reference/utility/move.md)`(t)`で初期化する
41+
- (4) : `value_{`[`in_place`](/reference/utility/in_place_t.md)`,` [`std::forward`](/reference/utility/forward.md)`<Args>(args)...}`で初期化する
42+
43+
44+
## 例
45+
```cpp example
46+
#include <iostream>
47+
#include <ranges>
48+
#include <string>
49+
50+
int main() {
51+
// (2) コピー構築
52+
{
53+
std::string s1 = "hello";
54+
for (const std::string& x : std::views::single(s1)) {
55+
std::cout << x << std::endl;
56+
}
57+
}
58+
59+
// (3) ムーブ構築
60+
{
61+
std::string s1 = "hello";
62+
for (const std::string& x : std::views::single(std::move(s1))) {
63+
std::cout << x << std::endl;
64+
}
65+
}
66+
67+
// (4) コンストラクタ引数から構築
68+
{
69+
for (const std::string& x : std::ranges::single_view<std::string>(std::in_place, 3, 'a')) {
70+
std::cout << x << std::endl;
71+
}
72+
}
73+
}
74+
75+
```
76+
* std::ranges::single_view[color ff0000]
77+
* std::views::single[color ff0000]
78+
79+
### 出力
80+
```
81+
hello
82+
hello
83+
aaa
84+
```
85+
86+
## バージョン
87+
### 言語
88+
- C++20
89+
90+
### 処理系
91+
- [Clang](/implementation.md#clang): 13.0.0 [mark verified]
92+
- [GCC](/implementation.md#gcc): 10.1.0 [mark verified]
93+
- [ICC](/implementation.md#icc): ?
94+
- [Visual C++](/implementation.md#visual_cpp): 2019 Update 10 [mark verified]
95+
96+
## 参照
97+
- [N4861 24.7.4 Filter view](https://timsong-cpp.github.io/cppwp/n4861/range.filter)
98+
- [N4950 26.7.8 Filter view](https://timsong-cpp.github.io/cppwp/n4950/range.filter)

0 commit comments

Comments
 (0)