Skip to content

Commit 64398ea

Browse files
committed
[i|o]stringstream : C++26 string_viewの仕様に対応 #1186
1 parent 9ff68ed commit 64398ea

File tree

8 files changed

+475
-37
lines changed

8 files changed

+475
-37
lines changed

reference/sstream/basic_istringstream/op_constructor.md

Lines changed: 75 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,24 +52,62 @@ basic_istringstream(
5252
const Allocator& a); // (9) C++20
5353

5454
basic_istringstream(basic_istringstream&& rhs); // (10) C++11
55+
56+
template<class T>
57+
explicit basic_istringstream(
58+
const T& t,
59+
ios_base::openmode which = ios_base::in); // (11) C++26
60+
61+
template<class T>
62+
basic_istringstream(
63+
const T& t,
64+
const Allocator& a); // (12) C++26
65+
66+
template<class T>
67+
basic_istringstream(
68+
const T& t,
69+
ios_base::openmode which,
70+
const Allocator& a); // (13) C++26
5571
```
5672
* ios_base[link /reference/ios/ios_base.md]
5773
* basic_string[link /reference/string/basic_string.md]
5874
5975
## 概要
6076
`basic_istringstream`オブジェクトを構築する。
6177
78+
- (1) : デフォルトコンストラクタ
79+
- (2) : 指定されたモードで構築する
80+
- (3) : 入力文字列として[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピーを指定して構築する
81+
- (4) : 指定されたモードとアロケータで構築する
82+
- (5) : 入力文字列として[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピーと、アロケータを指定して構築する
83+
- (6) : 入力文字列として[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピー、モード、アロケータを指定して構築する
84+
- (7) : 入力文字列として`Allocator`に変換可能なアロケータをもつ[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピーと、モードを指定して構築する
85+
- (8) : 入力文字列として`Allocator`に変換可能なアロケータをもつ[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピーと、アロケータを指定して構築する
86+
- (9) : 入力文字列として`Allocator`に変換可能なアロケータをもつ[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピー、モード、アロケータを指定して構築する
87+
- (10) : ムーブコンストラクタ
88+
- (11) : 入力文字列として[`std::basic_string_view`](/reference/string_view/basic_string_view.md)に変換可能な文字列と、モードを指定して構築する
89+
- (12) : 入力文字列として[`std::basic_string_view`](/reference/string_view/basic_string_view.md)に変換可能な文字列と、アロケータを指定して構築する
90+
- (13) : 入力文字列として[`std::basic_string_view`](/reference/string_view/basic_string_view.md)に変換可能な文字列、モード、アロケータを指定して構築する
91+
92+
93+
## テンプレートパラメータ制約
94+
- (11), (12), (13) : `is_convertible_v<const T&, basic_string_view<CharT, Traits>>`が`true`であること
95+
6296
## 効果
6397
- (1) : 内部の`basic_stringbuf`オブジェクトを`basic_stringbuf<CharT, Traits, Allocator>(ios_base::in)`で構築する
6498
- (2) : 内部の`basic_stringbuf`オブジェクトを`basic_stringbuf<CharT, Traits, Allocator>(which | ios_base::in)`で構築する
6599
- (3) : 内部の`basic_stringbuf`オブジェクトを`basic_stringbuf<CharT, Traits, Allocator>(s, which | ios_base::in)`で構築する
66100
- (4) : 内部の`basic_stringbuf`オブジェクトを`basic_stringbuf<CharT, Traits, Allocator>(std::move(s), which | ios_base::in)`で構築する
67101
- (5) : 内部の`basic_stringbuf`オブジェクトを`basic_stringbuf<CharT, Traits, Allocator>(which | ios_base::in, a)`で構築する
68-
- (6), (7), (8), (9), (10) : 各引数が対応する`basic_stringbuf`のコンストラクタに渡される
69-
- (11) : `rhs`から`basic_istringstream`オブジェクトをムーブ構築する
102+
- (6), (7), (8), (9) : 各引数が対応する`basic_stringbuf`のコンストラクタに渡される
103+
- (10) : `rhs`から`basic_istringstream`オブジェクトをムーブ構築する
104+
- (11) : `basic_string_view<CharT, Traits>(t)`で文字列を初期化し、モードは`which | ios_base::in`に設定する
105+
- (12) : `basic_string_view<CharT, Traits>(t)`で文字列を初期化し、モードは`ios_base::in`、アロケータは`a`に設定する
106+
- (13) : `basic_string_view<CharT, Traits>(t)`で文字列を初期化し、モードは`which | ios_base::in`、アロケータは`a`に設定する
70107
71108
72109
## 例
110+
### 基本的な使い方
73111
```cpp example
74112
#include <iostream>
75113
#include <sstream>
@@ -82,16 +120,48 @@ int main()
82120
// (3) 文字列を指定して構築
83121
std::istringstream ss2("initial text");
84122
85-
int value;
123+
std::string value;
86124
ss2 >> value;
87125
std::cout << value << std::endl;
88126
}
89127
```
90128

91-
### 出力
129+
#### 出力
92130
```
93131
initial
94132
```
95133

134+
### string_viewからの構築 (C++26)
135+
```cpp example
136+
#include <iostream>
137+
#include <sstream>
138+
#include <string_view>
139+
140+
int main()
141+
{
142+
// 文字列リテラルから構築
143+
std::istringstream ss1{"Hello World"};
144+
std::string s1;
145+
ss1 >> s1;
146+
std::cout << s1 << std::endl;
147+
148+
// string_viewから構築
149+
std::string_view sv = "Hello World";
150+
std::istringstream ss2{sv};
151+
std::string s2;
152+
ss2 >> s2;
153+
std::cout << s2 << std::endl;
154+
}
155+
```
156+
157+
#### 出力
158+
```
159+
Hello
160+
Hello
161+
```
162+
163+
96164
## 参照
97-
- [P0408R7 Efficient Access to `basic_stringbuf`'s Buffer](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0408r7.pdf)
165+
- [P0408R7 Efficient Access to `basic_stringbuf`'s Buffer](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0408r7.pdf)
166+
- [P2495R3 Interfacing stringstreams with `string_view`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2495r3.pdf)
167+
- C++26で[`std::string_view`](/reference/string_view/basic_string_view.md)に対応した

reference/sstream/basic_istringstream/str.md

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,38 @@ void str(const basic_string<CharT, Traits, Allocator>& s); // (4) C++03
1818
template <class SAlloc>
1919
void str(const basic_string<CharT, Traits, SAlloc>& s); // (5) C++20
2020
void str(const basic_string<CharT, Traits, Allocator>&& s); // (6) C++20
21+
22+
template<class T>
23+
void str(const T& t); // (7) C++26
2124
```
2225
* basic_string[link /reference/string/basic_string.md]
2326
2427
## 概要
2528
文字列オブジェクトを取得または設定する。
2629
30+
- (1) : 文字列オブジェクトを取得する
31+
- (2) : 文字列オブジェクトを取得して、`SAlloc`型のアロケータ`sa`によって確保する
32+
- (3) : 保持する文字列オブジェクトをムーブして取得する
33+
- (4) : 文字列オブジェクト`s`を設定する
34+
- (5) : `Allocator`に変換可能な`SAlloc`型のアロケータによって確保されているデータをコピーして、文字列オブジェクト`s`を設定する
35+
- (6) : 与えられた文字列オブジェクト`s`をムーブして設定する
36+
- (7) : [`std::basic_string_view`](/reference/string_view/basic_string_view.md)に変換可能な文字列を設定する
37+
38+
39+
## テンプレートパラメータ制約
40+
- (7) : `is_convertible_v<const T&, basic_string_view<CharT, Traits>>`が`true`であること
41+
2742
## 効果
2843
- (1) : `return rdbuf()->str()` と等価
2944
- (2) : `return rdbuf()->str(sa)` と等価
3045
- (3) : `return std::move(*rdbuf()).str()` と等価
3146
- (4) : `rdbuf()->str(s)` と等価
3247
- (5) : `rdbuf()->str(s)` と等価
3348
- (6) : `rdbuf()->str(std::move(s))` と等価
49+
- (7) : `rdbuf()->str(t)` と等価
3450
3551
## 例
52+
### 基本的な使い方
3653
```cpp example
3754
#include <iostream>
3855
#include <sstream>
@@ -66,7 +83,7 @@ int main()
6683
}
6784
```
6885

69-
### 出力
86+
#### 出力
7087
```
7188
Content: Hello World 123 45.67
7289
Read word: Hello
@@ -75,9 +92,64 @@ New read: New content 999
7592
Empty? yes
7693
```
7794

95+
#### ムーブを使用する例 (C++20)
96+
```cpp example
97+
#include <iostream>
98+
#include <sstream>
99+
100+
int main() {
101+
std::istringstream ss;
102+
103+
// ムーブして文字列を設定
104+
std::string s = "Move string";
105+
ss.str(std::move(s));
106+
std::cout << ss.str() << std::endl;
107+
108+
// ムーブで文字列を取得
109+
std::string r = std::move(ss).str();
110+
std::cout << r << std::endl;
111+
}
112+
```
113+
114+
#### 出力
115+
```
116+
Move string
117+
Move string
118+
```
119+
120+
121+
### string_viewからの設定 (C++26)
122+
```cpp example
123+
#include <iostream>
124+
#include <sstream>
125+
#include <string_view>
126+
127+
int main() {
128+
std::istringstream ss;
129+
130+
// 文字列リテラルを設定
131+
ss.str("set from string literal");
132+
std::cout << ss.str() << std::endl;
133+
134+
// string_viewを設定
135+
std::string_view sv = "set from string_view";
136+
ss.str(sv);
137+
std::cout << ss.str() << std::endl;
138+
}
139+
```
140+
141+
#### 出力
142+
```
143+
set from string literal
144+
set from string_view
145+
```
146+
147+
78148
## 関連項目
79149
- [`basic_stringbuf::str`](../basic_stringbuf/str.md)
80150

81151

82152
## 参照
83153
- [P0408R7 Efficient Access to `basic_stringbuf`'s Buffer](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0408r7.pdf)
154+
- [P2495R3 Interfacing stringstreams with `string_view`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2495r3.pdf)
155+
- C++26で[`std::string_view`](/reference/string_view/basic_string_view.md)に対応した

reference/sstream/basic_ostringstream/op_constructor.md

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,24 +52,64 @@ basic_ostringstream(
5252
const Allocator& a); // (9) C++20
5353

5454
basic_ostringstream(basic_ostringstream&& rhs); // (10) C++11
55+
56+
template<class T>
57+
explicit basic_ostringstream(
58+
const T& t,
59+
ios_base::openmode which = ios_base::out); // (11) C++26
60+
61+
template<class T>
62+
basic_ostringstream(
63+
const T& t,
64+
const Allocator& a); // (12) C++26
65+
66+
template<class T>
67+
basic_ostringstream(
68+
const T& t,
69+
ios_base::openmode which,
70+
const Allocator& a); // (13) C++26
5571
```
5672
* ios_base[link /reference/ios/ios_base.md]
5773
* basic_string[link /reference/string/basic_string.md]
5874
5975
## 概要
6076
`basic_ostringstream`オブジェクトを構築する。
6177
78+
ここで、初期値として設定する文字列は、既存のファイルを上書きモードで開くことに似ており、ストリームの初期位置が先頭のまま、ストリーム内容の文字列を設定するものである。モードとして[`std::ios_base::ate`](/reference/ios/ios_base/type-openmode.md)を指定しすると、ストリームの初期位置が末尾に設定される。
79+
80+
- (1) : デフォルトコンストラクタ
81+
- (2) : 指定されたモードで構築する
82+
- (3) : 初期文字列として[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピーを指定して構築する
83+
- (4) : 指定されたモードとアロケータで構築する
84+
- (5) : 初期文字列として[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピーと、アロケータを指定して構築する
85+
- (6) : 初期文字列として[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピー、モード、アロケータを指定して構築する
86+
- (7) : 初期文字列として`Allocator`に変換可能なアロケータをもつ[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピーと、モードを指定して構築する
87+
- (8) : 初期文字列として`Allocator`に変換可能なアロケータをもつ[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピーと、アロケータを指定して構築する
88+
- (9) : 初期文字列として`Allocator`に変換可能なアロケータをもつ[`std::basic_string`](/reference/string/basic_string.md)オブジェクトのコピー、モード、アロケータを指定して構築する
89+
- (10) : ムーブコンストラクタ
90+
- (11) : 初期文字列として[`std::basic_string_view`](/reference/string_view/basic_string_view.md)に変換可能な文字列と、モードを指定して構築する
91+
- (12) : 初期文字列として[`std::basic_string_view`](/reference/string_view/basic_string_view.md)に変換可能な文字列と、アロケータを指定して構築する
92+
- (13) : 初期文字列として[`std::basic_string_view`](/reference/string_view/basic_string_view.md)に変換可能な文字列、モード、アロケータを指定して構築する
93+
94+
95+
## テンプレートパラメータ制約
96+
- (11), (12), (13) : `is_convertible_v<const T&, basic_string_view<CharT, Traits>>`が`true`であること
97+
6298
## 効果
6399
- (1) : 内部の`basic_stringbuf`オブジェクトを`basic_stringbuf<CharT, Traits, Allocator>(ios_base::out)`で構築する
64100
- (2) : 内部の`basic_stringbuf`オブジェクトを`basic_stringbuf<CharT, Traits, Allocator>(which | ios_base::out)`で構築する
65101
- (3) : 内部の`basic_stringbuf`オブジェクトを`basic_stringbuf<CharT, Traits, Allocator>(s, which | ios_base::out)`で構築する
66102
- (4) : 内部の`basic_stringbuf`オブジェクトを`basic_stringbuf<CharT, Traits, Allocator>(std::move(s), which | ios_base::out)`で構築する
67103
- (5) : 内部の`basic_stringbuf`オブジェクトを`basic_stringbuf<CharT, Traits, Allocator>(which | ios_base::out, a)`で構築する
68-
- (6), (7), (8), (9), (10) : 各引数が対応する`basic_stringbuf`のコンストラクタに渡される
69-
- (11) : `rhs`から`basic_ostringstream`オブジェクトをムーブ構築する
104+
- (6), (7), (8), (9) : 各引数が対応する`basic_stringbuf`のコンストラクタに渡される
105+
- (10) : `rhs`から`basic_ostringstream`オブジェクトをムーブ構築する
106+
- (11) : `basic_string_view<CharT, Traits>(t)`で文字列を初期化し、モードは`which | ios_base::out`に設定する
107+
- (12) : `basic_string_view<CharT, Traits>(t)`で文字列を初期化し、モードは`ios_base::out`、アロケータは`a`に設定する
108+
- (13) : `basic_string_view<CharT, Traits>(t)`で文字列を初期化し、モードは`which | ios_base::out`、アロケータは`a`に設定する
70109
71110
72111
## 例
112+
### 基本的な使い方
73113
```cpp example
74114
#include <iostream>
75115
#include <sstream>
@@ -82,18 +122,47 @@ int main()
82122
std::cout << ss1.str() << std::endl;
83123
84124
// (3) 文字列を指定して構築
85-
std::ostringstream ss2("initial ");
125+
std::ostringstream ss2("xxxx yyyy");
86126
ss2 << "text";
87127
std::cout << ss2.str() << std::endl;
88128
}
89129
```
90130
* str()[link str.md]
91131

92-
### 出力
132+
#### 出力
93133
```
94134
default
95-
initial text
135+
text yyyy
136+
```
137+
138+
### string_viewからの構築 (C++26)
139+
```cpp example
140+
#include <iostream>
141+
#include <sstream>
142+
#include <string_view>
143+
144+
int main()
145+
{
146+
// 文字列リテラルから構築
147+
std::ostringstream ss1{"Hello?", std::ios_base::ate};
148+
ss1 << "World";
149+
std::cout << ss1.str() << std::endl;
150+
151+
// string_viewから構築
152+
std::string_view sv = "Hello?";
153+
std::ostringstream ss2{sv};
154+
ss2 << "World";
155+
std::cout << ss2.str() << std::endl;
156+
}
157+
```
158+
159+
#### 出力
160+
```
161+
Hello?World
162+
World?
96163
```
97164

98165
## 参照
99-
- [P0408R7 Efficient Access to `basic_stringbuf`'s Buffer](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0408r7.pdf)
166+
- [P0408R7 Efficient Access to `basic_stringbuf`'s Buffer](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0408r7.pdf)
167+
- [P2495R3 Interfacing stringstreams with `string_view`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2495r3.pdf)
168+
- C++26で[`std::string_view`](/reference/string_view/basic_string_view.md)に対応した

0 commit comments

Comments
 (0)