[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/08 13:32 / Filesize : 255 KB / Number-of Response : 1019
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part159



1 名前:デフォルトの名無しさん [2022/02/19(土) 11:56:42.14 ID:kSnJ/KwP.net]
前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1636969758/

369 名前:デフォルトの名無しさん mailto:sage [2022/03/02(水) 01:32:22.77 ID:/wwlA8Tq.net]
なんでこんなとこにrust信者が湧いてるん?

370 名前:デフォルトの名無しさん mailto:sage [2022/03/02(水) 03:41:00.25 ID:re9dUtRi.net]
C++のstatic_castで十分すっきりしてるし安全なんだがw

371 名前:デフォルトの名無しさん mailto:sage [2022/03/02(水) 03:51:26.38 ID:S8+3WyDZ.net]
うむ
まあRustはトレイトを導入しているためもっとフレキシブルに機能毎に事実上のキャストができる点で先に進んでる感じ

372 名前:デフォルトの名無しさん mailto:sage [2022/03/02(水) 04:16:03.37 ID:re9dUtRi.net]
std::visitで十分じゃないの?

373 名前:デフォルトの名無しさん mailto:sage [2022/03/02(水) 06:05:07.28 ID:+cCq037X.net]
>>364
メンタルはルビ基地と同じだから相手すんな

374 名前:デフォルトの名無しさん mailto:sage [2022/03/02(水) 08:02:10.51 ID:UQPkqsb3.net]
>>364
スレ違い野郎はNG推奨

375 名前:デフォルトの名無しさん [2022/03/02(水) 10:15:53.71 ID:KGds3ROy.net]
RustはUnityで作られてるんだからC#スレ行けよ

376 名前:デフォルトの名無しさん mailto:sage [2022/03/03(木) 11:52:56.52 ID:YmcISO0J.net]
有名なライブラリのコード覗いて見るとC++でもマクロ結構使ってるよね

377 名前:デフォルトの名無しさん mailto:sage [2022/03/03(木) 12:21:01.59 ID:aVzPtAzs.net]
まあそこは女性のウェストが50cmだと思ってるスペック厨のオタクと現実に生きて実用的なものを開発してる人の違いだね



378 名前:デフォルトの名無しさん mailto:sage [2022/03/03(木) 12:24:43.91 ID:adLRB/+A.net]
有名ライブラリこそマクロに頼らないとやってられんとこあるからな

コンパイル環境(gcc/clang/MSVC)のスイッチとか
C++バージョンのスイッチとか(#define CONSTEVAL20 consteval/constexpr)

ボイラープレートの簡略化はどれぐらいやってるかは知らんが

379 名前:デフォルトの名無しさん mailto:sage [2022/03/03(木) 15:14:53.11 ID:dDnSjvDO.net]
条件コンパイルには#ifdefがいるね

380 名前:デフォルトの名無しさん mailto:sage [2022/03/03(木) 16:48:19.79 ID:PsZF8bq4.net]
文法ばかり勉強してコード書かないからマクロの必要性が見えないんだよ。

381 名前:デフォルトの名無しさん mailto:sage [2022/03/03(木) 18:39:02.62 ID:c7Jb1Y/C.net]
ああ、マクロ不要論者は自分でライブラリ書いたことないというオチか
腑に落ちたわ

382 名前:デフォルトの名無しさん mailto:sage [2022/03/03(木) 19:24:38.63 ID:hTxF5AaQ.net]
まともにコード書く量も質も足りない人にはマクロの弊害を認識できてないんだろうなw
インクルードガードなどの条件コンパイルはプリプロセスではあるものの、一般的なマクロ置換処理ではないw

383 名前:デフォルトの名無しさん mailto:sage [2022/03/03(木) 19:49:49.09 ID:l1hFvrU8.net]
本気でいってんの?このバカ

384 名前:デフォルトの名無しさん mailto:sage [2022/03/03(木) 20:05:07.59 ID:hTxF5AaQ.net]
単発IDで中身のない煽りだけの人が早速出現w
臆病すぎwwww

385 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 05:56:44.52 ID:1RB3fRbG.net]
> マクロ不要論者

誰? いたっけ、そんなやつ

386 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 06:37:36.91 ID:DqQFNqIa.net]
>>380
>>336あたりじゃね?

387 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 06:43:28.40 ID:1RB3fRbG.net]
ああ、あのキチか
相手すると馬鹿が伝染るからやめようぜ



388 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 11:43:03.93 ID:4zB49VIz.net]
まだいたのか臆病者w 答え教えてもらってもなお理解しない人に付ける薬はないよw
構ってちゃんやるなら別の板でやれ

389 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 20:47:43.90 ID:TVZZL9aI.net]
コンパイル時にansiをunicodeに変換する簡単な方法あってある?
具体的にはmagic_enum::enum_namesで返ってくるstring_view配列をwchar_tとして貰いたいのだけど

390 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 20:55:24.70 ID:4zB49VIz.net]
exe野郎は口を開く権利なしw
ソースコードのエンコーディングを指定するか、エスケープした文字列まで正しく変換したソースを使った上で、必要なキャストをするか、プロジェクト設定を使えw

391 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 20:58:03.36 ID:nHKPE6Wj.net]
MSの教えどおりにマクロ使ってれば簡単なのにな。

392 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 21:17:57.65 ID:4zB49VIz.net]
そもそも言ってる内容が怪しいw ワイド文字の話とエンコーディングの話がごっちゃになってるw

393 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 21:40:05.34 ID:TVZZL9aI.net]
ansiをunicodeにエンコードしたいって意味なんだけど自分でテーブルでもつくらないとconstevalには無理?
それ以外に方法がないならライブラリいじることにするけど

394 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 21:47:53.46 ID:4zB49VIz.net]
動くサンプルを載せてみろw

395 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 21:55:46.03 ID:cJZvpdpU.net]
ansiってなにを指すん?

396 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 21:56:54.08 ID:1RB3fRbG.net]
アメリカの国内規格

397 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:00:02.02 ID:4zB49VIz.net]
MS様のお庭ではローカルコードページくらいの意味だw



398 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:05:54.66 ID:TVZZL9aI.net]
>>390
日本語WindowsMSVCだと"あ"はansi(shift-jis)として{ 0x82, 0xA0 }になる
これをunicodeの0x3042にエンコードするって感じでconstexprに生成されたansiを変換していきたい
ライブラリ内部では__FUNCSIG__等を利用して静的にenumから文字を生成してるからL#でもして端からunicodeを生成すれば良いんだけどその場合は他にも色々と変えないとダメだからそれは最終手段にしたい

399 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:07:55.03 ID:4zB49VIz.net]
>>393
ごたくはいいから動くサンプルを載せてみろw

400 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:12:15.56 ID:TVZZL9aI.net]
>>394
動くサンプルって何?
動く見通しついてないからこうして質問してるんだけどとりあえずansi版でもいいからサンプル見たいってことか?

enum class AIUEO { あ, い, う, え, お };
void print(){
constexpr auto texts = constexpr auto texts = magic_enum::enum_nameptrs<AIUEO>();
for (auto& str : texts) puts(str.data()); //ほんとはここを_putws的なunicodeを受け取るものに投げたい
}

401 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:14:02.23 ID:TVZZL9aI.net]
今即席でスマホのブラウザで書いたからconstexpr auto texts = constexpr auto texts = のところミスってるけどスルーしといて

402 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:14:34.14 ID:4zB49VIz.net]
main関数がないので動かんな
magic_enumもないので動かんな
これがお前の「動く」サンプルなのか???w

403 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:16:37.08 ID:aciaBeWI.net]
出たよサンプルないと何もできないおじさん

404 名前:蟻人間 mailto:sage [2022/03/04(金) 22:33:11.96 ID:08B25WN2.net]
https://qiita.com/ta_dragon/items/1828ceb16bc8733526e1
貼っとくよ。

405 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:42:39.88 ID:rsYyHWe+.net]
constexpr std::string s="test";
constexpr std::wstring ws=L"test";

こいつらが通らない時点で俺は諦めた
最終的にほしい型はstd::wstring_viewだろうけど
std::array<wchar_t, size>ならなんとかなるかもしれん

406 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:52:27.11 ID:nHKPE6Wj.net]
そもそもウクライナに寄付しろとか言う前に他民族、多言語に対応しろとmagic_e

407 名前:num作者にメールすべき。 []
[ここ壊れてます]



408 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 22:57:11.67 ID:4zB49VIz.net]
違うだろw こいつが動かせてないだけだろwwww

409 名前:デフォルトの名無しさん mailto:sage [2022/03/04(金) 23:05:31.04 ID:TVZZL9aI.net]
>>399
まさにnameofと同じ作者のものだけど、やっぱ__FUNCSIG__の部分からLつけていくしかなさそうだな

410 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 00:24:50.51 ID:AqnMHu7I.net]
まだ動かせないんかいw

411 名前:蟻人間 mailto:sage [2022/03/05(土) 00:27:03.13 ID:z+1i+qt8.net]
L##

412 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 00:45:32.11 ID:E2o+9AFP.net]
C##

413 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:02:31.13 ID:AqnMHu7I.net]
一応言っておくと__FUNCSIG__はリテラルじゃなくてシンボルだぞw
>type hoge.cpp
hoge(__FUNCSIG__);
>cl /P /std:c++17 hoge.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.28.29912 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

hoge.cpp

>type hoge.i
#line 1 "hoge.cpp"
hoge(__FUNCSIG__);

>
なんというか...ロクに動かせもしないアホが一足飛びに余計なことして普通なら瞬間に出来ることを他人様に何度も何度も聞いて回るというねw

414 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:13:20.54 ID:rFZZ/Cia.net]
>>407
>__FUNCSIG__ 外側の関数のシグネチャを含む文字列リテラルとして定義されます。
直接Lは付けられないが#define L(x) L##xを使えばちゃんとワイド文字リテラルとなる
ついでに言っておくとVSのこの手のマクロはANSIではなくUTF8だったと思うぞ(固定ではなくソースコードの文字コード依存の可能性あり)

415 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:23:21.22 ID:AqnMHu7I.net]
utf8は正解なんだが、リテラルは不正解w
https://godbolt.org/z/4G1vvhrEc
コンパイラがリテラルに置き換えるわけだけど、プリプロセッサではシンボルのままなので置換されると分からなくなるw

416 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:25:23.87 ID:AZBfqXsc.net]
MSVCの場合 /execution-charset で指定した文字コード(デフォルトはsjis=cp932)になるんじゃなかったかな

417 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:37:21.06 ID:AqnMHu7I.net]




418 名前:指定時はソースと同じらしい
https://docs.microsoft.com/ja-jp/cpp/build/reference/execution-charset-set-execution-character-set?view=msvc-170
でutf-8になってたようだな
[]
[ここ壊れてます]

419 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:47:40.22 ID:AqnMHu7I.net]
ただし、__FUNCSIG__はそういうのに影響されずutf-8っぽい
普通のリテラルはちゃんとシフトJISで出るけど、__FUNCSIG__はutf8だな

420 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:49:42.38 ID:AZBfqXsc.net]
ややこしいな、そういうのが一番困るんだよねw

421 名前:デフォルトの名無しさん mailto:sage [2022/03/05(土) 01:52:53.77 ID:AqnMHu7I.net]
MSにありがちw ただシンボルに日本語とかキチガイしかしないからw

422 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 06:57:02.25 ID:RhJCMKRm.net]
>>414
だって規格で認めてるじゃん
ISO/IEC 14882:2020(E)
12.8 User-defined literals [over.literal]
8 [Example 1:
template <char...> double operator "" _\u03C0(); // OK: UCN for lowercase pi

423 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 07:14:15.82 ID:2Lq6XwwP.net]
引用が仕様ですらないし、引用元もないし、、、挙げ句内容的に__FUNCSIG__はシグニチャ付きの関数名がリテラルとして入るだけだぞw
その関数名に日本語使うのキチガイだけだろw
リテラル調べてどうするんだよw

424 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 07:41:36.14 ID:RhJCMKRm.net]
関数名の一部ってことわかんない?

425 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 12:31:32.96 ID:2Lq6XwwP.net]
君に何かを理解してもらうのは諦めるよ
俺の力では無理

426 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 12:38:21.73 ID:RhJCMKRm.net]
捨て台詞にしてももうちっとくらいマシなこと言えねえの?

427 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 20:42:37.07 ID:padO6mVy.net]
>>395
初心者だけどこれってプログラム内の変数名や関数名に日本語を出したいってこと?
あ = 3;
みたいな



428 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:21:28.85 ID:yDdB4j8G.net]
規格上はもうUnicodeの文字はだいたい使えるぞ
移植性やコーディングスタイルや常識の観点での良し悪しは別にして

429 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:29:08.28 ID:ivurCOzA.net]
>>420
俺抜きでレスバしてて恐縮だが
enum class AIUEO { あ, い, う, え, お };
const wchar_t* aiueo[] = { L"あ", L"い", L"う", L"え", L"お" };
enumに合わせてこんな感じで文字列も欲しいってこと
utf8からutf16へのエンコードは割と簡単に実装出来るという事が判明して、200行くらいかかったけどconstevalなu8_to_u16関数作ってmagic_enum::detail::n部分からwide版作っていくことで解決できた

430 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:34:05.04 ID:yDdB4j8G.net]
ええやんプルリクしといてよ

431 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:39:53.01 ID:ivurCOzA.net]
いいけど既に同じようなissue出してる人いて「constexprに文字列返されるので別の形にしたいならそっちで自由にやって」みたいな感じだったからな

432 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:55:07.26 ID:uQvWeikk.net]
これだから白人は嫌なんだよね。

433 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 21:58:54.49 ID:2Lq6XwwP.net]
昔からキチガイがシンボルに日本語使ってたりしたし、規格仕様の該当項目も挙げてないのに可能というのはおかしく
またソースコードや出力設定が何かに依るのが正しい可能性だって普通にある
またutf8というかunicodeとそのエンコーディング形式は簡単な計算式で可換
200行あればvc++固有ならmagic_enumの使用機能全て載せられるし、そもそも不要
そもそも情報小出しな時点、puts使ったりしてる時点、vc++を好き好んで使ってる時点でもうね・・・
挙げ句説明なくても5分もあれば気づくことに何日かかってるのかって人のプルリクが通るわけないだろw

434 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 23:18:01.19 ID:ivurCOzA.net]
>>425
まぁ面倒だからってよりこのスレにもちらほらいるようにASCII文字だけを想定してて
それだけなら1文字づつキャストするだけで簡単に出来るだろうしusing string_view = std::string_viewの所を上書きできるようにしておくから自前でやってって感じだな

435 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 23:23:59.38 ID:2Lq6XwwP.net]
「ASCII文字だけを想定してて」wwwww

436 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 23:29:43.95 ID:m7T5bZFc.net]
マクロ騒動で脳が破壊されてしまった子がいるね

437 名前:デフォルトの名無しさん mailto:sage [2022/03/07(月) 23:46:00.91 ID:47rZ/1iq.net]
SEXの時は動かずにマグロになってしまったようですね
やっぱりロボトミー手術してよかったですね



438 名前:デフォルトの名無しさん mailto:sage [2022/03/08(火) 21:56:42.93 ID:A5UfccGR.net]
>>422
はえー解決したなら良かった
まだまだ勉強不足だから半分理解できなかったけどconstexprはstring_view型なら使えることは学んだ

439 名前:デフォルトの名無しさん mailto:sage [2022/03/08(火) 22:58:13.81 ID:2Ie6O3y5.net]
はいはい、一人何役するのかねw

440 名前:デフォルトの名無しさん mailto:sage [2022/03/08(火) 23:19:40.19 ID:lL5N1LvC.net]
>>432
我々ギフハブがいつも見ているぞ

441 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 18:10:06.68 ID:USdHjBxA.net]
テンプレートの可変長引数って一般的な実装だとスタックに積まれるの?
てことはあんまり大きいデータは渡せない?

442 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 18:17:21.80 ID:6o5PvaaD.net]
template-parameter-packは実行環境では普通の引数と全く同じだ
翻訳中の解釈でどんな「普通の引数」にするか判断してるだけ

443 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 21:39:59.02 ID:xy5Q90JZ.net]
template<class...T>void f(T...t){}

f(1,2,3,4); で実体化されるf<int,int,int,int>は、
void f(int,int,int,int){}
と同じ扱いをされる。
普通の関数と変わらんよ。

たぶん気にしてるのはこんな感じの再帰実装だろう
template<class First>auto sum(First first){return first;}
template<class First, class Second, class...Rest>
auto sum(First first, Second second, Rest...rest){
return first+sum(second, rest...);
}
sum(1,2,3,4,5,6,7,8,9);

最適化なしコンパイルだとクソ真面目に45*sizeof(int)と9段分のリターンアドレスとか諸々をスタックに積む

最適化ありコンパイルなら大体インライン展開されるからさほど大事にはならない

444 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 07:47:35.25 ID:GmBPyzdt.net]
#include <utility>
template<class First>auto sum(First first){return first;}
template<class First, class... Rest>
auto sum(First first, Rest... rest){
return first+sum(rest...);
}
template <class T, T... Seq>
auto sum_seq(std::integer_sequence<T, Seq...>) {
return sum(Seq...);
}
int main() {
return sum_seq(std::make_index_sequence<100>());
}
こんな感じになるよ
https://godbolt.org/z/obj4ra671
途中経過のテンプレートも全て関数実体として展開される
最適化すると、この例だと全部定数で計算されるけど

445 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 08:12:59.76 ID:GmBPyzdt.net]
流石にちょっと説明追加しておきます。
sum_seq(std::make_index_sequence<100>())の部分は
sum(0,1,2,3,...,97,98,99)と同じです。
sum(0,1,2,3,...,97,98,99)は
sum(0) + sum(1,2,3,...,97,98,99)で計算されます。第2項の
sum(1,2,3,...,97,98,99)は
sum(1) + sum(2,3,...,97,98,99)で計算されます。第2項の
sum(2,3,...,97,98,99)は
...
sum(98,99)は
sum(98) + sum(99)で計算されます。
つまりすごい再起的に呼び出してバカ正直に壮絶な計算をするため、スタック消費も大きいということ。

446 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 08:30:00.26 ID:bj9xq9MP.net]
おれおれtemplateの例ですね。

447 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 11:44:15.06 ID:yxfxX1kD.net]
普通はテンプレつかった可変引数でも、イニシャライザでforで回して足して終わりっしょ。
なぜ自分で再帰にして書くのやら。



448 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 12:14:25.50 ID:GmBPyzdt.net]
>>440
一般には可変長テンプレート引数の型が一律とは限らないので

449 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 12:45:09.09 ID:FGXUCKCr.net]
>>440
initializer_listは実行時の解釈なので
翻訳時に全てを解決できるテンプレートを使っていて
それが出てきてしまうと残念な気持ちになる

450 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 19:55:16.89 ID:XC1WHC10.net]
constexprでやればいいじゃん

451 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 19:58:15.85 ID:bj9xq9MP.net]
なんでもtemplateにしたい病なんですよ。プロジェクトで一番迷惑なタイプです。
おれおれtemplateは可読性、保守性が一気に落ちるので勘弁してください。

452 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 20:09:30.59 ID:rOwnBpGX.net]
読む方は溜まったもんじゃないが書くのも実行速度もなんだかんだテンプレートが一番早いんで…

453 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 21:26:30.13 ID:FGXUCKCr.net]
>>444
純コンパイラ方式の言語を使ってるのに
中間コードを使わにゃならんところが出てくると
残念な気持ちにならん?

もっと極端に言うとアセンブラからBASICやBATを呼び出すようなこと
人それぞれで何も感じない人っているのかね

454 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 22:03:21.13 ID:GmBPyzdt.net]
例えばさっきのシーケンスをランダムな数字をその場で生成みたいな感じにすると、
#include <random>
#include <iostream>
#include <utility>
using namespace std;
template<class First>auto sum(First first){return first;}
template<class First, class... Rest> auto sum(First first, Rest... rest){return first+sum(rest...);}
template<class... Args> auto print_and_sum(Args... args) {
for (auto e: {args...}) cout << e << endl; // ココ
return sum(args...);
}
template <typename F, size_t... Seq> auto gen_and_print_and_sum_impl(F func, index_sequence<Seq...> ) {
return print_and_sum(func(Seq)...);
}
int main() {
random_device seed_gen;
mt19937 engine(seed_gen());
const size_t n = 3;
cout << gen_and_print_and_sum_impl(
[&](size_t i){ return engine();},
std::make_index_sequence<n>{}) << endl;
return 0;
}
こんな感じになるけど、genとprintとsumを分けたいとなるとtupleにしたくなって、templateでparameter packとtupleを行き来することになり、結構煩雑になる気はする
今は分けずに初期化リストにぶち込んで誤魔化してるけど…
こういうのも分けてtemplateにする?

455 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 22:03:23.71 ID:bj9xq9MP.net]
>>446
加算するだけの処理でtemplate使わない場合
どういった中間コードが作成されるのですか?

456 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 22:52:13.11 ID:GmBPyzdt.net]
ちなみに分けてテンプレートにしてみた。もう1レスに収まらないので消えたらごめんw
https://godbolt.org/z/YoxG7b4ro

457 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 23:14:03.97 ID:GmBPyzdt.net]
#include <random>
#include <iostream>
#include <tuple>
using namespace std; // 余計なコード消したらギリギリ入ったw
template<class First>auto sum(First first){return first;}
template<class First, class... Rest> auto sum(First first, Rest... rest){return first+sum(rest...);}
template<typename T, size_t... Seq>
auto sum_tpl_impl(const T& tpl, index_sequence<Seq...>) {return sum(get<Seq>(tpl)...);}
template<typename... Types> auto sum_tpl(const tuple<Types...>& tpl) {
return sum_tpl_impl(tpl, make_index_sequence<tuple_size<tuple<Types...>>{}>{});
}
template <typename T, typename F, T... Seq> auto gen_impl(F func, index_sequence<Seq...>) {
return make_tuple(func(Seq)...);
}
template <size_t N, typename F> auto gen(F func) {
return gen_impl<decltype((func)(0))>(func, make_index_sequence<N>{});
}
template <typename T, size_t... Seq> void print_impl(const T& tpl, index_sequence<Seq...>) {
for (auto e: {get<Seq>(tpl)...}) cout << e << endl;
}
template <typename T> void print(const T& tpl) {
print_impl(tpl, make_index_sequence<tuple_size<T>{}>{});
}
int main() {
random_device seed_gen;
mt19937 engine(seed_gen());
const size_t n = 3;
const auto tpl = gen<n>([&](size_t i){ return engine();});
print(tpl);
cout << sum_tpl(tpl) << endl;
return 0;
}



458 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:11:11.84 ID:uDPm4ane.net]
大学で下記のようなSTLアルゴリズムの課題が出たのですが、全然わからないです

Hogeというstructがあったときに、
class HogeCollection {
public:
  void display(ostream& os) const;
  friend ostream& operator << (ostream& os, const Hoge& hoge);
private:
  vector<Hoge> m_hoges;
};

display関数でm_hogesのすべてのHogeに対して os <<を呼び出し出力させなさい。
ただしforやwhileなどの手動ループを使用しないこと。

459 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:12:32.40 ID:aEfI8PjB.net]
>>450
ちょっとバグってたので修正
template <typename F, size_t... Seq> auto gen_impl(F func, index_sequence<Seq...>) {
return make_tuple(func(Seq)...);
}
template <size_t N, typename F> auto gen(F func) {
return gen_impl(func, make_index_sequence<N>{});
}

460 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:14:20.70 ID:aEfI8PjB.net]
>>451
言われた通りにやればいいやん

461 名前:蟻人間 mailto:sage [2022/03/12(土) 13:16:03.75 ID:0xm7vL+e.net]
>>451
<algorithm>を見てみ。便利な関数があるから。

462 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:21:05.85 ID:45uBSPYW.net]
「STLアルゴリズム」の課題だからSTL使えばいいんだもんな…
自分でアルゴリズム実装しろって課題だったらちょっと面倒だが

463 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:21:47.65 ID:uDPm4ane.net]
>>453,454
ありがとうございます。
std::for_each()なんてのがあるんですね・・・

464 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 13:55:39.46 ID:uDPm4ane.net]
度々すみません。
display関数を書いたのですが、VS2019でコンパイルエラーになります。

void HogeCollection::display(ostream& out) const
{
  std::for_each(m_hoges.begin(), m_hoges.end(), [](const Hoge& hoge){ out << hoge; });
}

error C3493: 既定のキャプチャ モードが指定されていないため、'out' を暗黙的にキャプチャできません

465 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 14:02:30.95 ID:9rXKBdgd.net]
キャプチャモードを指定してあげれば…

466 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 14:09:52.70 ID:uDPm4ane.net]
>>458
ありがとうございます。以下で通りました!
[&out](const Hoge& hoge){ out << hoge; }

467 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 21:02:47.42 ID:uDPm4ane.net]
もう1つ、STLの問題がわからないので、質問させてください。

>>451のHogeCollectionに以下のようなメンバ関数があるとします。
void sort_by_key(const string& key)
{
  if (key == "a") (Hogeのメンバ変数 m_aでソート);
  else if (key == "b") (Hogeのメンバ変数 m_bでソート);
}

keyの値が"a" か "b"以外のときはエラーにしたい場合に、
実行時エラーでなくコンパイルエラーにするには、
この関数をどのように再設計すればよいでしょうか。



468 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 21:08:31.31 ID:yBTVs/aF.net]
keyの値はコンパイル時に決まるん?

469 名前:デフォルトの名無しさん mailto:sage [2022/03/12(土) 21:49:16.97 ID:uDPm4ane.net]
>>461
そうですね。
今のプログラムでは、main関数で sort_by_key("a"); のように呼び出しています。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<255KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef