Skip to content

Commit e449113

Browse files
committed
add deduction guide with range to some containers.
1 parent e25e0cd commit e449113

File tree

17 files changed

+359
-41
lines changed

17 files changed

+359
-41
lines changed

reference/deque/deque/op_deduction_guide.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,25 @@ namespace std {
99
template <class InputIterator,
1010
class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
1111
deque(InputIterator, InputIterator, Allocator = Allocator())
12-
-> deque<typename iterator_traits<InputIterator>::value_type, Allocator>;
12+
-> deque<typename iterator_traits<InputIterator>::value_type, Allocator>; // (1)
13+
14+
template <ranges::input_range R,
15+
class Allocator = allocator<ranges::range_value_t<R>>>
16+
deque(from_range_t, R&&, Allocator = Allocator())
17+
-> deque<ranges::range_value_t<R>, Allocator>; // (2) C++23から
1318
}
1419
```
1520
* iterator_traits[link /reference/iterator/iterator_traits.md]
21+
* ranges::input_range[link /reference/ranges/input_range.md]
22+
* allocator[link /reference/memory/allocator.md]
23+
* ranges::range_value_t[link /reference/ranges/range_value_t.md]
24+
* from_range_t[link /reference/ranges/from_range_t.md]
1625
1726
## 概要
18-
`std::deque`クラステンプレートの型推論補助。イテレータ範囲から推論する。
27+
`std::deque`クラステンプレートの型推論補助。
28+
29+
- (1) : イテレータ範囲から推論する。
30+
- (2) : Rangeから推論する。
1931
2032
2133
## 例

reference/forward_list/forward_list/op_deduction_guide.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,25 @@ namespace std {
99
template <class InputIterator,
1010
class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
1111
forward_list(InputIterator, InputIterator, Allocator = Allocator())
12-
-> forward_list<typename iterator_traits<InputIterator>::value_type, Allocator>;
12+
-> forward_list<typename iterator_traits<InputIterator>::value_type, Allocator>; // (1)
13+
14+
template <ranges::input_range R,
15+
class Allocator = allocator<ranges::range_value_t<R>>>
16+
forward_list(from_range_t, R&&, Allocator = Allocator())
17+
-> forward_list<ranges::range_value_t<R>, Allocator>; // (2) C++23から
1318
}
1419
```
1520
* iterator_traits[link /reference/iterator/iterator_traits.md]
21+
* ranges::input_range[link /reference/ranges/input_range.md]
22+
* allocator[link /reference/memory/allocator.md]
23+
* ranges::range_value_t[link /reference/ranges/range_value_t.md]
24+
* from_range_t[link /reference/ranges/from_range_t.md]
1625
1726
## 概要
18-
`std::forward_list`クラステンプレートの型推論補助。イテレータ範囲から推論する。
27+
`std::forward_list`クラステンプレートの型推論補助。
28+
29+
- (1) : イテレータ範囲から推論する。
30+
- (2) : Rangeから推論する。
1931
2032
2133
## 例

reference/list/list/op_constructor.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ list(from_range_t, R&& rg,
3535
const Allocator& a = Allocator()); // (11) C++23 から
3636
```
3737
* initializer_list[link /reference/initializer_list/initializer_list.md]
38-
* from_range_t[link ../../ranges/from_range_t.md]
38+
* from_range_t[link /reference/ranges/from_range_t.md]
3939
4040
4141
## 概要

reference/list/list/op_deduction_guide.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,25 @@ namespace std {
99
template <class InputIterator,
1010
class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
1111
list(InputIterator, InputIterator, Allocator = Allocator())
12-
-> list<typename iterator_traits<InputIterator>::value_type, Allocator>;
12+
-> list<typename iterator_traits<InputIterator>::value_type, Allocator>; // (1)
13+
14+
template <ranges::input_range R,
15+
class Allocator = allocator<ranges::range_value_t<R>>>
16+
list(from_range_t, R&&, Allocator = Allocator())
17+
-> list<ranges::range_value_t<R>, Allocator>; // (2) C++23から
1318
}
1419
```
1520
* iterator_traits[link /reference/iterator/iterator_traits.md]
21+
* ranges::input_range[link /reference/ranges/input_range.md]
22+
* allocator[link /reference/memory/allocator.md]
23+
* ranges::range_value_t[link /reference/ranges/range_value_t.md]
24+
* from_range_t[link /reference/ranges/from_range_t.md]
1625
1726
## 概要
18-
`std::list`クラステンプレートの型推論補助。イテレータ範囲から推論する。
27+
`std::list`クラステンプレートの型推論補助。
28+
29+
- (1) : イテレータ範囲から推論する。
30+
- (2) : Rangeから推論する。
1931
2032
2133
## 例

reference/map/map/op_deduction_guide.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ namespace std {
1414
template <class InputIterator>
1515
using iter_to_alloc_t = pair<add_const_t<typename iterator_traits<InputIterator>::value_type::first_type>,
1616
typename iterator_traits<InputIterator>::value_type::second_type>;
17+
template <ranges::input_range Range>
18+
using range_key_t = remove_const_t<typename ranges::range_value_t<Range>::first_type>;
19+
template <ranges::input_range Range>
20+
using range_val_t = typename ranges::range_value_t<Range>::second_type;
1721

1822
template <class InputIterator,
1923
class Compare = less<iter_key_t<InputIterator>>,
@@ -36,6 +40,10 @@ namespace std {
3640
template <class Key, class T, class Allocator>
3741
map(initializer_list<pair<Key, T>>, Allocator)
3842
-> map<Key, T, less<Key>, Allocator>; // (4)
43+
44+
template <ranges::input_range R, class Allocator>
45+
map(from_range_t, R&&, Allocator)
46+
-> map<range_key_t<R>, range_val_t<R>, less<range_key_t<R>>, Allocator>; // (5) C++23から
3947
}
4048
```
4149
* remove_const_t[link /reference/type_traits/remove_const.md]
@@ -45,6 +53,9 @@ namespace std {
4553
* less[link /reference/functional/less.md]
4654
* allocator[link /reference/memory/allocator.md]
4755
* initializer_list[link /reference/initializer_list/initializer_list.md]
56+
* ranges::input_range[link /reference/ranges/input_range.md]
57+
* ranges::range_value_t[link /reference/ranges/range_value_t.md]
58+
* from_range_t[link /reference/ranges/from_range_t.md]
4859
4960
## 概要
5061
`std::map`クラステンプレートの型推論補助。
@@ -53,6 +64,7 @@ namespace std {
5364
- (2) : 初期化子リストからの推論
5465
- (3) : イテレータ範囲とアロケータからの推論
5566
- (4) : 初期化子リストとアロケータからの推論
67+
- (5) : Rangeからの推論
5668
5769
5870
## 備考

reference/map/multimap/op_deduction_guide.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ namespace std {
1414
template <class InputIterator>
1515
using iter_to_alloc_t = pair<add_const_t<typename iterator_traits<InputIterator>::value_type::first_type>,
1616
typename iterator_traits<InputIterator>::value_type::second_type>;
17+
template <ranges::input_range Range>
18+
using range_key_t = remove_const_t<typename ranges::range_value_t<Range>::first_type>;
19+
template <ranges::input_range Range>
20+
using range_val_t = typename ranges::range_value_t<Range>::second_type;
1721

1822
template <class InputIterator,
1923
class Compare = less<iter_key_t<InputIterator>>,
@@ -36,6 +40,10 @@ namespace std {
3640
template <class Key, class T, class Allocator>
3741
multimap(initializer_list<pair<Key, T>>, Allocator)
3842
-> multimap<Key, T, less<Key>, Allocator>; // (4)
43+
44+
template <ranges::input_range R, class Allocator>
45+
multimap(from_range_t, R&&, Allocator)
46+
-> multimap<range_key_t<R>, range_val_t<R>, less<range_key_t<R>>, Allocator>; // (5) C++23から
3947
}
4048
```
4149
* remove_const_t[link /reference/type_traits/remove_const.md]
@@ -45,6 +53,9 @@ namespace std {
4553
* less[link /reference/functional/less.md]
4654
* allocator[link /reference/memory/allocator.md]
4755
* initializer_list[link /reference/initializer_list/initializer_list.md]
56+
* ranges::input_range[link /reference/ranges/input_range.md]
57+
* ranges::range_value_t[link /reference/ranges/range_value_t.md]
58+
* from_range_t[link /reference/ranges/from_range_t.md]
4859
4960
## 概要
5061
`std::multimap`クラステンプレートの型推論補助。
@@ -53,6 +64,7 @@ namespace std {
5364
- (2) : 初期化子リストからの推論
5465
- (3) : イテレータ範囲とアロケータからの推論
5566
- (4) : 初期化子リストとアロケータからの推論
67+
- (5) : Rangeからの推論
5668
5769
5870
## 備考

reference/queue/priority_queue/op_deduction_guide.md

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,76 @@
66

77
```cpp
88
namespace std {
9-
template <class Compare, class Container>
9+
// 説明用の型
10+
template <class InputIterator>
11+
using iter_val_t = typename iterator_traits<InputIterator>::value_type;
12+
13+
template <class Compare, class Container>
1014
priority_queue(Compare, Container)
1115
-> priority_queue<typename Container::value_type, Container, Compare>; // (1)
1216

1317
template <class InputIterator,
14-
class Compare = less<typename iterator_traits<InputIterator>::value_type>,
15-
class Container = std::vector<typename iterator_traits<InputIterator>::value_type>>
18+
class Compare = less<iter_val_t<InputIterator>>,
19+
class Container = std::vector<iter_val_t<InputIterator>>>
1620
priority_queue(InputIterator, InputIterator, Compare = Compare(), Container = Container())
17-
-> priority_queue<
18-
typename iterator_traits<InputIterator>::value_type,
19-
Container, Compare>; // (2)
21+
-> priority_queue<iter_val_t<InputIterator>, Container, Compare>; // (2)
22+
23+
template <ranges::input_range R, class Compare = less<ranges::range_value_t<R>>>
24+
priority_queue(from_range_t, R&&, Compare = Compare())
25+
-> priority_queue<ranges::range_value_t<R>,
26+
vector<ranges::range_value_t<R>>, Compare>; // (3) C++23から
2027

2128
template <class Compare, class Container, class Allocator>
2229
priority_queue(Compare, Container, Allocator)
23-
-> priority_queue<typename Container::value_type, Container, Compare>; // (3)
30+
-> priority_queue<typename Container::value_type, Container, Compare>; // (4)
31+
32+
template <class InputIterator, class Allocator>
33+
priority_queue(InputIterator, InputIterator, Allocator)
34+
-> priority_queue<iter_val_t<InputIterator>,
35+
vector<iter_val_t<InputIterator>, Allocator>,
36+
less<iter_val_t<InputIterator>>>; // (5) C++23から
37+
38+
template <class InputIterator, class Compare, class Allocator>
39+
priority_queue(InputIterator, InputIterator, Compare, Allocator)
40+
-> priority_queue<iter_val_t<InputIterator>,
41+
vector<iter_val_t<InputIterator>, Allocator>,
42+
Compare>; // (6) C++23から
43+
44+
template <class InputIterator, class Compare, class Container, class Allocator>
45+
priority_queue(InputIterator, InputIterator, Compare, Container, Allocator)
46+
-> priority_queue<typename Container::value_type, Container, Compare>; // (7) C++23から
47+
48+
template <ranges::input_range R, class Compare, class Allocator>
49+
priority_queue(from_range_t, R&&, Compare, Allocator)
50+
-> priority_queue<ranges::range_value_t<R>,
51+
vector<ranges::range_value_t<R>, Allocator>,
52+
Compare>; // (8) C++23から
53+
54+
template <ranges::input_range R, class Allocator>
55+
priority_queue(from_range_t, R&&, Allocator)
56+
-> priority_queue<ranges::range_value_t<R>,
57+
vector<ranges::range_value_t<R>, Allocator>>; // (9) C++23から
2458
}
2559
```
2660
* iterator_traits[link /reference/iterator/iterator_traits.md]
2761
* less[link /reference/functional/less.md]
62+
* vector[link /reference/vector/vector.md]
63+
* ranges::input_range[link /reference/ranges/input_range.md]
64+
* ranges::range_value_t[link /reference/ranges/range_value_t.md]
65+
* from_range_t[link /reference/ranges/from_range_t.md]
2866
2967
## 概要
3068
`std::priority_queue`クラステンプレートの型推論補助。
3169
3270
- (1) : 比較関数オブジェクトと、元となるコンテナから推論する
3371
- (2) : イテレータ範囲、比較関数オブジェクト、元となるコンテナから推論する
34-
- (3) : 比較関数オブジェクトと、元となるコンテナ、アロケータから推論する
72+
- (3) : Rangeと比較関数オブジェクトから推論する
73+
- (4) : 比較関数オブジェクトと、元となるコンテナ、アロケータから推論する
74+
- (5) : イテレータ範囲とアロケータから推論する
75+
- (6) : イテレータ範囲、比較関数オブジェクト、アロケータから推論する
76+
- (7) : イテレータ範囲、比較関数オブジェクト、元となるコンテナ、アロケータから推論する
77+
- (8) : Range、比較関数オブジェクト、元となるコンテナから推論する
78+
- (9) : Rangeとアロケータから推論する
3579
3680
3781
## 例

reference/queue/queue/op_deduction_guide.md

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,47 @@
88
namespace std {
99
template <class Container>
1010
queue(Container)
11-
-> queue<typename Container::value_type, Container>; // (1)
11+
-> queue<typename Container::value_type, Container>; // (1)
1212

13-
template<class InputIterator>
13+
template <class InputIterator>
1414
queue(InputIterator, InputIterator)
15-
-> queue<<InputIterator>>; // (2) C++23
15+
-> queue<<InputIterator>>; // (2) C++23
16+
17+
template <ranges::input_range R>
18+
queue(from_range_t, R&&) -> queue<ranges::range_value_t<R>>; // (3) C++23
19+
1620

1721
template <class Container, class Allocator>
1822
queue(Container, Allocator)
19-
-> queue<typename Container::value_type, Container>; // (3)
23+
-> queue<typename Container::value_type, Container>; // (4)
2024

21-
template<class InputIterator, class Allocator>
25+
template <class InputIterator, class Allocator>
2226
queue(InputIterator, InputIterator, Allocator)
2327
-> queue<iter-value-type<InputIterator>, deque<iter-value-type<InputIterator>,
24-
Allocator>>; // (4) C++23
28+
Allocator>>; // (5) C++23
29+
30+
template <ranges::input_range R, class Allocator>
31+
queue(from_range_t, R&&, Allocator)
32+
-> queue<ranges::range_value_t<R>, deque<ranges::range_value_t<R>,
33+
Allocator>>; // (6) C++23
34+
2535
}
2636
```
2737
* iter-value-type[italic]
38+
* deque[link /reference/deque/deque.md]
39+
* ranges::input_range[link /reference/ranges/input_range.md]
40+
* ranges::range_value_t[link /reference/ranges/range_value_t.md]
41+
* from_range_t[link /reference/ranges/from_range_t.md]
2842
2943
## 概要
30-
`std::queue`クラステンプレートの型推論補助。元となるコンテナから推論する。
44+
`std::queue`クラステンプレートの型推論補助。
45+
46+
- (1) : 元となるコンテナから推論する。
47+
- (2) : イテレータ範囲から推論する。
48+
- (3) : Rangeからの推論する。
49+
- (4) : 元となるコンテナとアロケータから推論する。
50+
- (5) : イテレータ範囲とアロケータから推論する。
51+
- (6) : Rangeとアロケータからの推論する。
3152
3253
3354
## 例

reference/set/multiset/op_deduction_guide.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,23 @@ namespace std {
2020
template <class InputIterator, class Allocator>
2121
multiset(InputIterator, InputIterator, Allocator)
2222
-> multiset<typename iterator_traits<InputIterator>::value_type,
23-
less<typename iterator_traits<InputIterator>::value_type>, Allocator>; // (3)
23+
less<typename iterator_traits<InputIterator>::value_type>, Allocator>; // (3)
2424

2525
template <class Key, class Allocator>
26-
multiset(initializer_list<Key>, Allocator) -> multiset<Key, less<Key>, Allocator>; // (4)
26+
multiset(initializer_list<Key>, Allocator) -> multiset<Key, less<Key>, Allocator>; // (4)
27+
28+
template <ranges::input_range R, class Allocator>
29+
multiset(from_range_t, R&&, Allocator)
30+
-> multiset<ranges::range_value_t<R>, less<ranges::range_value_t<R>>, Allocator>; // (5) C++23から
2731
}
2832
```
2933
* less[link /reference/functional/less.md]
3034
* iterator_traits[link /reference/iterator/iterator_traits.md]
3135
* allocator[link /reference/memory/allocator.md]
3236
* initializer_list[link /reference/initializer_list/initializer_list.md]
37+
* ranges::input_range[link /reference/ranges/input_range.md]
38+
* ranges::range_value_t[link /reference/ranges/range_value_t.md]
39+
* from_range_t[link /reference/ranges/from_range_t.md]
3340
3441
## 概要
3542
`std::multiset`クラステンプレートの型推論補助。
@@ -38,6 +45,7 @@ namespace std {
3845
- (2) : 初期化子リストと比較関数オブジェクトからの推論
3946
- (3) : イテレータ範囲とアロケータからの推論
4047
- (4) : 初期化子リストとアロケータからの推論
48+
- (5) : Rangeからの推論
4149
4250
4351
## 例

reference/set/set/op_deduction_guide.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,19 @@ namespace std {
2424

2525
template <class Key, class Allocator>
2626
set(initializer_list<Key>, Allocator) -> set<Key, less<Key>, Allocator>; // (4)
27+
28+
template <ranges::input_range R, class Allocator>
29+
set(from_range_t, R&&, Allocator)
30+
-> set<ranges::range_value_t<R>, less<ranges::range_value_t<R>>, Allocator>; // (5) C++23から
2731
}
2832
```
2933
* less[link /reference/functional/less.md]
3034
* iterator_traits[link /reference/iterator/iterator_traits.md]
3135
* allocator[link /reference/memory/allocator.md]
3236
* initializer_list[link /reference/initializer_list/initializer_list.md]
37+
* ranges::input_range[link /reference/ranges/input_range.md]
38+
* ranges::range_value_t[link /reference/ranges/range_value_t.md]
39+
* from_range_t[link /reference/ranges/from_range_t.md]
3340
3441
## 概要
3542
`std::set`クラステンプレートの型推論補助。
@@ -38,6 +45,7 @@ namespace std {
3845
- (2) : 初期化子リストと比較関数オブジェクトからの推論
3946
- (3) : イテレータ範囲とアロケータからの推論
4047
- (4) : 初期化子リストとアロケータからの推論
48+
- (5) : Rangeからの推論
4149
4250
4351
## 例

0 commit comments

Comments
 (0)