質問編集履歴

2

追記

2021/03/27 07:58

投稿

hoge111
hoge111

スコア17

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

名前の改善

2021/03/27 07:58

投稿

hoge111
hoge111

スコア17

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