質問編集履歴
2
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -139,3 +139,99 @@
|
|
139
139
|
## 補足
|
140
140
|
|
141
141
|
もし足りない情報などがありましたらコメントお願いします.
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
## 追記(2021/3/27)
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
```
|
150
|
+
|
151
|
+
//コメント欄より
|
152
|
+
|
153
|
+
std::arrayではだめな理由を追記してください。どう考えてもstd::arrayで十分だし簡潔な方法です。
|
154
|
+
|
155
|
+
```
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
その通りだと思いました.よくよく考えてみると配列である必要はありませんでした.
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
#### 経緯
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
とあるGUIのライブラリで引数が```void WriteText(const char* text)```のように,```const char*```型で文字情報を渡す関数がありました.
|
168
|
+
|
169
|
+
c++20以前は
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
```cpp
|
174
|
+
|
175
|
+
const char* text = "あああ";
|
176
|
+
|
177
|
+
WriteText(text);
|
178
|
+
|
179
|
+
```
|
180
|
+
|
181
|
+
でしっかりと```あああ```と日本語表示されていたのですが,C++20では文字化けして```???```と表示されるようになりました.初心者なので詳しくはよくわかりませんが,C++20では文字列に大幅な変更が入ったようです.
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
そこでライブラリが対応する(?)までは```char_8t```を```reinterpret_cast<const char*>```して使うことにしました.
|
186
|
+
|
187
|
+
|
188
|
+
|
189
|
+
```cpp
|
190
|
+
|
191
|
+
char8_t text = u8"あああ";
|
192
|
+
|
193
|
+
auto casttext = reinterpret_cast<const char*>(text);
|
194
|
+
|
195
|
+
WriteText(casttext);//文字化けせずに表示される.
|
196
|
+
|
197
|
+
```
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
次に,文字列を結合したい欲がでてきました.```array```版はつくれたのですが,配列にすればわかりやすくていいなと.
|
202
|
+
|
203
|
+
そこで,質問文に載せたコードの```array```ではなく```配列```版があればなと思い質問しました.
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
**がしかし**,コメント欄にあるように```array```でも問題ないように**今**は思います.
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
```cpp
|
212
|
+
|
213
|
+
std::array<char8_t, 10> text1 = { u8"あああ" };
|
214
|
+
|
215
|
+
char8_t text2[] = { u8"あああ" };
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
auto casttext = reinterpret_cast<const char*>(text1.data());
|
220
|
+
|
221
|
+
auto casttext2 = reinterpret_cast<const char*>(text2);
|
222
|
+
|
223
|
+
```
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
この書き方が安全なのかはわかりませんが,欲しい動作はしてくれています.
|
228
|
+
|
229
|
+
```array```で問題ありません.
|
230
|
+
|
231
|
+
|
232
|
+
|
233
|
+
---
|
234
|
+
|
235
|
+
私なりには解決しました.
|
236
|
+
|
237
|
+
自己解決を使えば質問を閉じれるようなのですが,問題の答え自体がでたわけではないので,未来の誰かさんのためにもう少し様子を見てみます.
|
1
名前の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -22,9 +22,9 @@
|
|
22
22
|
|
23
23
|
|
24
24
|
|
25
|
-
template<std::size_t LS, std::size_t RS>
|
25
|
+
template<std::size_t LeftSize, std::size_t RightSize>
|
26
26
|
|
27
|
-
consteval std::array<char, LS + RS - 2> ketugou(const char(&left)[LS], const char(&right)[RS]) {
|
27
|
+
consteval std::array<char, LeftSize + RightSize - 2> ketugou(const char(&left)[LeftSize], const char(&right)[RightSize]) {
|
28
28
|
|
29
29
|
|
30
30
|
|
@@ -32,13 +32,13 @@
|
|
32
32
|
|
33
33
|
//-2しているのはnull文字分
|
34
34
|
|
35
|
-
std::array<char, LS + RS - 2> result = {};
|
35
|
+
std::array<char, LeftSize + RightSize - 2> result = {};
|
36
36
|
|
37
37
|
|
38
38
|
|
39
39
|
for (std::size_t i = 0, j = 0; auto & x : result) {
|
40
40
|
|
41
|
-
if (i < LS - 1) {
|
41
|
+
if (i < LeftSize - 1) {
|
42
42
|
|
43
43
|
x = left[i];
|
44
44
|
|