前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1636969758/
探検
C++相談室 part159
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2022/02/19(土) 11:56:42.14ID:kSnJ/KwP351デフォルトの名無しさん
2022/03/01(火) 06:35:21.34ID:MT73K7Vw352デフォルトの名無しさん
2022/03/01(火) 07:02:46.96ID:qblu1Z+O354デフォルトの名無しさん
2022/03/01(火) 09:06:42.29ID:cUOzOJ3p355デフォルトの名無しさん
2022/03/01(火) 10:19:23.90ID:Hv9eImco struct B{...}*bP;
struct D1 : public B{...} d1;
struct D2 : public B{...} d2;
bP = (...)? &d1 : &d2;
これって駄目なんですね
struct D1 : public B{...} d1;
struct D2 : public B{...} d2;
bP = (...)? &d1 : &d2;
これって駄目なんですね
356デフォルトの名無しさん
2022/03/01(火) 10:40:29.97ID:MQDieCXt357デフォルトの名無しさん
2022/03/01(火) 11:01:53.10ID:Hv9eImco なるほど
素直にif文にしておきます
素直にif文にしておきます
358デフォルトの名無しさん
2022/03/01(火) 11:08:34.73ID:cMGuQY9h つ static_cast<bP>(&d#)
359デフォルトの名無しさん
2022/03/01(火) 11:13:51.24ID:qblu1Z+O360デフォルトの名無しさん
2022/03/01(火) 11:14:23.15ID:qblu1Z+O rnd() & 1
は無視してくれw
は無視してくれw
361デフォルトの名無しさん
2022/03/01(火) 11:14:50.30ID:Hv9eImco ああ、それでいいんですね
ありがとうございます
ありがとうございます
362デフォルトの名無しさん
2022/03/01(火) 11:54:42.57ID:MT73K7Vw 今度はCに毒されていくC++スレw
プリプロセッサはincludeパス的に言語や標準ライブラリを結構意識したりしますw
プリプロセッサはincludeパス的に言語や標準ライブラリを結構意識したりしますw
363デフォルトの名無しさん
2022/03/01(火) 23:30:51.45ID:cUOzOJ3p >>355
そういうのはRustがすっきり実現していていい感じ
静的モノモーフィングでコンパイル時に解決させる方法と
動的ディスパッチで実行時に解決させる方法の2種類を選びつつ簡単かつ安全に記述できる
そういうのはRustがすっきり実現していていい感じ
静的モノモーフィングでコンパイル時に解決させる方法と
動的ディスパッチで実行時に解決させる方法の2種類を選びつつ簡単かつ安全に記述できる
364デフォルトの名無しさん
2022/03/02(水) 01:32:22.77ID:/wwlA8Tq なんでこんなとこにrust信者が湧いてるん?
365デフォルトの名無しさん
2022/03/02(水) 03:41:00.25ID:re9dUtRi C++のstatic_castで十分すっきりしてるし安全なんだがw
366デフォルトの名無しさん
2022/03/02(水) 03:51:26.38ID:S8+3WyDZ うむ
まあRustはトレイトを導入しているためもっとフレキシブルに機能毎に事実上のキャストができる点で先に進んでる感じ
まあRustはトレイトを導入しているためもっとフレキシブルに機能毎に事実上のキャストができる点で先に進んでる感じ
367デフォルトの名無しさん
2022/03/02(水) 04:16:03.37ID:re9dUtRi std::visitで十分じゃないの?
368デフォルトの名無しさん
2022/03/02(水) 06:05:07.28ID:+cCq037X >>364
メンタルはルビ基地と同じだから相手すんな
メンタルはルビ基地と同じだから相手すんな
369デフォルトの名無しさん
2022/03/02(水) 08:02:10.51ID:UQPkqsb3 >>364
スレ違い野郎はNG推奨
スレ違い野郎はNG推奨
370デフォルトの名無しさん
2022/03/02(水) 10:15:53.71ID:KGds3ROy RustはUnityで作られてるんだからC#スレ行けよ
371デフォルトの名無しさん
2022/03/03(木) 11:52:56.52ID:YmcISO0J 有名なライブラリのコード覗いて見るとC++でもマクロ結構使ってるよね
372デフォルトの名無しさん
2022/03/03(木) 12:21:01.59ID:aVzPtAzs まあそこは女性のウェストが50cmだと思ってるスペック厨のオタクと現実に生きて実用的なものを開発してる人の違いだね
373デフォルトの名無しさん
2022/03/03(木) 12:24:43.91ID:adLRB/+A 有名ライブラリこそマクロに頼らないとやってられんとこあるからな
コンパイル環境(gcc/clang/MSVC)のスイッチとか
C++バージョンのスイッチとか(#define CONSTEVAL20 consteval/constexpr)
ボイラープレートの簡略化はどれぐらいやってるかは知らんが
コンパイル環境(gcc/clang/MSVC)のスイッチとか
C++バージョンのスイッチとか(#define CONSTEVAL20 consteval/constexpr)
ボイラープレートの簡略化はどれぐらいやってるかは知らんが
374デフォルトの名無しさん
2022/03/03(木) 15:14:53.11ID:dDnSjvDO 条件コンパイルには#ifdefがいるね
375デフォルトの名無しさん
2022/03/03(木) 16:48:19.79ID:PsZF8bq4 文法ばかり勉強してコード書かないからマクロの必要性が見えないんだよ。
376デフォルトの名無しさん
2022/03/03(木) 18:39:02.62ID:c7Jb1Y/C ああ、マクロ不要論者は自分でライブラリ書いたことないというオチか
腑に落ちたわ
腑に落ちたわ
377デフォルトの名無しさん
2022/03/03(木) 19:24:38.63ID:hTxF5AaQ まともにコード書く量も質も足りない人にはマクロの弊害を認識できてないんだろうなw
インクルードガードなどの条件コンパイルはプリプロセスではあるものの、一般的なマクロ置換処理ではないw
インクルードガードなどの条件コンパイルはプリプロセスではあるものの、一般的なマクロ置換処理ではないw
378デフォルトの名無しさん
2022/03/03(木) 19:49:49.09ID:l1hFvrU8 本気でいってんの?このバカ
379デフォルトの名無しさん
2022/03/03(木) 20:05:07.59ID:hTxF5AaQ 単発IDで中身のない煽りだけの人が早速出現w
臆病すぎwwww
臆病すぎwwww
380デフォルトの名無しさん
2022/03/04(金) 05:56:44.52ID:1RB3fRbG > マクロ不要論者
誰? いたっけ、そんなやつ
誰? いたっけ、そんなやつ
381デフォルトの名無しさん
2022/03/04(金) 06:37:36.91ID:DqQFNqIa382デフォルトの名無しさん
2022/03/04(金) 06:43:28.40ID:1RB3fRbG ああ、あのキチか
相手すると馬鹿が伝染るからやめようぜ
相手すると馬鹿が伝染るからやめようぜ
383デフォルトの名無しさん
2022/03/04(金) 11:43:03.93ID:4zB49VIz まだいたのか臆病者w 答え教えてもらってもなお理解しない人に付ける薬はないよw
構ってちゃんやるなら別の板でやれ
構ってちゃんやるなら別の板でやれ
384デフォルトの名無しさん
2022/03/04(金) 20:47:43.90ID:TVZZL9aI コンパイル時にansiをunicodeに変換する簡単な方法あってある?
具体的にはmagic_enum::enum_namesで返ってくるstring_view配列をwchar_tとして貰いたいのだけど
具体的にはmagic_enum::enum_namesで返ってくるstring_view配列をwchar_tとして貰いたいのだけど
385デフォルトの名無しさん
2022/03/04(金) 20:55:24.70ID:4zB49VIz exe野郎は口を開く権利なしw
ソースコードのエンコーディングを指定するか、エスケープした文字列まで正しく変換したソースを使った上で、必要なキャストをするか、プロジェクト設定を使えw
ソースコードのエンコーディングを指定するか、エスケープした文字列まで正しく変換したソースを使った上で、必要なキャストをするか、プロジェクト設定を使えw
386デフォルトの名無しさん
2022/03/04(金) 20:58:03.36ID:nHKPE6Wj MSの教えどおりにマクロ使ってれば簡単なのにな。
387デフォルトの名無しさん
2022/03/04(金) 21:17:57.65ID:4zB49VIz そもそも言ってる内容が怪しいw ワイド文字の話とエンコーディングの話がごっちゃになってるw
388デフォルトの名無しさん
2022/03/04(金) 21:40:05.34ID:TVZZL9aI ansiをunicodeにエンコードしたいって意味なんだけど自分でテーブルでもつくらないとconstevalには無理?
それ以外に方法がないならライブラリいじることにするけど
それ以外に方法がないならライブラリいじることにするけど
389デフォルトの名無しさん
2022/03/04(金) 21:47:53.46ID:4zB49VIz 動くサンプルを載せてみろw
390デフォルトの名無しさん
2022/03/04(金) 21:55:46.03ID:cJZvpdpU ansiってなにを指すん?
391デフォルトの名無しさん
2022/03/04(金) 21:56:54.08ID:1RB3fRbG アメリカの国内規格
392デフォルトの名無しさん
2022/03/04(金) 22:00:02.02ID:4zB49VIz MS様のお庭ではローカルコードページくらいの意味だw
393デフォルトの名無しさん
2022/03/04(金) 22:05:54.66ID:TVZZL9aI >>390
日本語WindowsMSVCだと"あ"はansi(shift-jis)として{ 0x82, 0xA0 }になる
これをunicodeの0x3042にエンコードするって感じでconstexprに生成されたansiを変換していきたい
ライブラリ内部では__FUNCSIG__等を利用して静的にenumから文字を生成してるからL#でもして端からunicodeを生成すれば良いんだけどその場合は他にも色々と変えないとダメだからそれは最終手段にしたい
日本語WindowsMSVCだと"あ"はansi(shift-jis)として{ 0x82, 0xA0 }になる
これをunicodeの0x3042にエンコードするって感じでconstexprに生成されたansiを変換していきたい
ライブラリ内部では__FUNCSIG__等を利用して静的にenumから文字を生成してるからL#でもして端からunicodeを生成すれば良いんだけどその場合は他にも色々と変えないとダメだからそれは最終手段にしたい
394デフォルトの名無しさん
2022/03/04(金) 22:07:55.03ID:4zB49VIz >>393
ごたくはいいから動くサンプルを載せてみろw
ごたくはいいから動くサンプルを載せてみろw
395デフォルトの名無しさん
2022/03/04(金) 22:12:15.56ID:TVZZL9aI >>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を受け取るものに投げたい
}
動くサンプルって何?
動く見通しついてないからこうして質問してるんだけどとりあえず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を受け取るものに投げたい
}
396デフォルトの名無しさん
2022/03/04(金) 22:14:02.23ID:TVZZL9aI 今即席でスマホのブラウザで書いたからconstexpr auto texts = constexpr auto texts = のところミスってるけどスルーしといて
397デフォルトの名無しさん
2022/03/04(金) 22:14:34.14ID:4zB49VIz main関数がないので動かんな
magic_enumもないので動かんな
これがお前の「動く」サンプルなのか???w
magic_enumもないので動かんな
これがお前の「動く」サンプルなのか???w
398デフォルトの名無しさん
2022/03/04(金) 22:16:37.08ID:aciaBeWI 出たよサンプルないと何もできないおじさん
399蟻人間 ◆T6xkBnTXz7B0
2022/03/04(金) 22:33:11.96ID:08B25WN2400デフォルトの名無しさん
2022/03/04(金) 22:42:39.88ID:rsYyHWe+ constexpr std::string s="test";
constexpr std::wstring ws=L"test";
こいつらが通らない時点で俺は諦めた
最終的にほしい型はstd::wstring_viewだろうけど
std::array<wchar_t, size>ならなんとかなるかもしれん
constexpr std::wstring ws=L"test";
こいつらが通らない時点で俺は諦めた
最終的にほしい型はstd::wstring_viewだろうけど
std::array<wchar_t, size>ならなんとかなるかもしれん
401デフォルトの名無しさん
2022/03/04(金) 22:52:27.11ID:nHKPE6Wj そもそもウクライナに寄付しろとか言う前に他民族、多言語に対応しろとmagic_enum作者にメールすべき。
402デフォルトの名無しさん
2022/03/04(金) 22:57:11.67ID:4zB49VIz 違うだろw こいつが動かせてないだけだろwwww
403デフォルトの名無しさん
2022/03/04(金) 23:05:31.04ID:TVZZL9aI >>399
まさにnameofと同じ作者のものだけど、やっぱ__FUNCSIG__の部分からLつけていくしかなさそうだな
まさにnameofと同じ作者のものだけど、やっぱ__FUNCSIG__の部分からLつけていくしかなさそうだな
404デフォルトの名無しさん
2022/03/05(土) 00:24:50.51ID:AqnMHu7I まだ動かせないんかいw
405蟻人間 ◆T6xkBnTXz7B0
2022/03/05(土) 00:27:03.13ID:z+1i+qt8 L##
406デフォルトの名無しさん
2022/03/05(土) 00:45:32.11ID:E2o+9AFP C##
407デフォルトの名無しさん
2022/03/05(土) 01:02:31.13ID:AqnMHu7I 一応言っておくと__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
>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
408デフォルトの名無しさん
2022/03/05(土) 01:13:20.54ID:rFZZ/Cia >>407
>__FUNCSIG__ 外側の関数のシグネチャを含む文字列リテラルとして定義されます。
直接Lは付けられないが#define L(x) L##xを使えばちゃんとワイド文字リテラルとなる
ついでに言っておくとVSのこの手のマクロはANSIではなくUTF8だったと思うぞ(固定ではなくソースコードの文字コード依存の可能性あり)
>__FUNCSIG__ 外側の関数のシグネチャを含む文字列リテラルとして定義されます。
直接Lは付けられないが#define L(x) L##xを使えばちゃんとワイド文字リテラルとなる
ついでに言っておくとVSのこの手のマクロはANSIではなくUTF8だったと思うぞ(固定ではなくソースコードの文字コード依存の可能性あり)
409デフォルトの名無しさん
2022/03/05(土) 01:23:21.22ID:AqnMHu7I utf8は正解なんだが、リテラルは不正解w
https://godbolt.org/z/4G1vvhrEc
コンパイラがリテラルに置き換えるわけだけど、プリプロセッサではシンボルのままなので置換されると分からなくなるw
https://godbolt.org/z/4G1vvhrEc
コンパイラがリテラルに置き換えるわけだけど、プリプロセッサではシンボルのままなので置換されると分からなくなるw
410デフォルトの名無しさん
2022/03/05(土) 01:25:23.87ID:AZBfqXsc MSVCの場合 /execution-charset で指定した文字コード(デフォルトはsjis=cp932)になるんじゃなかったかな
411デフォルトの名無しさん
2022/03/05(土) 01:37:21.06ID:AqnMHu7I 未指定時はソースと同じらしい
https://docs.microsoft.com/ja-jp/cpp/build/reference/execution-charset-set-execution-character-set?view=msvc-170
でutf-8になってたようだな
https://docs.microsoft.com/ja-jp/cpp/build/reference/execution-charset-set-execution-character-set?view=msvc-170
でutf-8になってたようだな
412デフォルトの名無しさん
2022/03/05(土) 01:47:40.22ID:AqnMHu7I ただし、__FUNCSIG__はそういうのに影響されずutf-8っぽい
普通のリテラルはちゃんとシフトJISで出るけど、__FUNCSIG__はutf8だな
普通のリテラルはちゃんとシフトJISで出るけど、__FUNCSIG__はutf8だな
413デフォルトの名無しさん
2022/03/05(土) 01:49:42.38ID:AZBfqXsc ややこしいな、そういうのが一番困るんだよねw
414デフォルトの名無しさん
2022/03/05(土) 01:52:53.77ID:AqnMHu7I MSにありがちw ただシンボルに日本語とかキチガイしかしないからw
415デフォルトの名無しさん
2022/03/07(月) 06:57:02.25ID:RhJCMKRm >>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
だって規格で認めてるじゃん
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
416デフォルトの名無しさん
2022/03/07(月) 07:14:15.82ID:2Lq6XwwP 引用が仕様ですらないし、引用元もないし、、、挙げ句内容的に__FUNCSIG__はシグニチャ付きの関数名がリテラルとして入るだけだぞw
その関数名に日本語使うのキチガイだけだろw
リテラル調べてどうするんだよw
その関数名に日本語使うのキチガイだけだろw
リテラル調べてどうするんだよw
417デフォルトの名無しさん
2022/03/07(月) 07:41:36.14ID:RhJCMKRm 関数名の一部ってことわかんない?
418デフォルトの名無しさん
2022/03/07(月) 12:31:32.96ID:2Lq6XwwP 君に何かを理解してもらうのは諦めるよ
俺の力では無理
俺の力では無理
419デフォルトの名無しさん
2022/03/07(月) 12:38:21.73ID:RhJCMKRm 捨て台詞にしてももうちっとくらいマシなこと言えねえの?
420デフォルトの名無しさん
2022/03/07(月) 20:42:37.07ID:padO6mVy421デフォルトの名無しさん
2022/03/07(月) 21:21:28.85ID:yDdB4j8G 規格上はもうUnicodeの文字はだいたい使えるぞ
移植性やコーディングスタイルや常識の観点での良し悪しは別にして
移植性やコーディングスタイルや常識の観点での良し悪しは別にして
422デフォルトの名無しさん
2022/03/07(月) 21:29:08.28ID:ivurCOzA >>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版作っていくことで解決できた
俺抜きでレスバしてて恐縮だが
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版作っていくことで解決できた
423デフォルトの名無しさん
2022/03/07(月) 21:34:05.04ID:yDdB4j8G ええやんプルリクしといてよ
424デフォルトの名無しさん
2022/03/07(月) 21:39:53.01ID:ivurCOzA いいけど既に同じようなissue出してる人いて「constexprに文字列返されるので別の形にしたいならそっちで自由にやって」みたいな感じだったからな
425デフォルトの名無しさん
2022/03/07(月) 21:55:07.26ID:uQvWeikk これだから白人は嫌なんだよね。
426デフォルトの名無しさん
2022/03/07(月) 21:58:54.49ID:2Lq6XwwP 昔からキチガイがシンボルに日本語使ってたりしたし、規格仕様の該当項目も挙げてないのに可能というのはおかしく
またソースコードや出力設定が何かに依るのが正しい可能性だって普通にある
またutf8というかunicodeとそのエンコーディング形式は簡単な計算式で可換
200行あればvc++固有ならmagic_enumの使用機能全て載せられるし、そもそも不要
そもそも情報小出しな時点、puts使ったりしてる時点、vc++を好き好んで使ってる時点でもうね・・・
挙げ句説明なくても5分もあれば気づくことに何日かかってるのかって人のプルリクが通るわけないだろw
またソースコードや出力設定が何かに依るのが正しい可能性だって普通にある
またutf8というかunicodeとそのエンコーディング形式は簡単な計算式で可換
200行あればvc++固有ならmagic_enumの使用機能全て載せられるし、そもそも不要
そもそも情報小出しな時点、puts使ったりしてる時点、vc++を好き好んで使ってる時点でもうね・・・
挙げ句説明なくても5分もあれば気づくことに何日かかってるのかって人のプルリクが通るわけないだろw
427デフォルトの名無しさん
2022/03/07(月) 23:18:01.19ID:ivurCOzA >>425
まぁ面倒だからってよりこのスレにもちらほらいるようにASCII文字だけを想定してて
それだけなら1文字づつキャストするだけで簡単に出来るだろうしusing string_view = std::string_viewの所を上書きできるようにしておくから自前でやってって感じだな
まぁ面倒だからってよりこのスレにもちらほらいるようにASCII文字だけを想定してて
それだけなら1文字づつキャストするだけで簡単に出来るだろうしusing string_view = std::string_viewの所を上書きできるようにしておくから自前でやってって感じだな
428デフォルトの名無しさん
2022/03/07(月) 23:23:59.38ID:2Lq6XwwP 「ASCII文字だけを想定してて」wwwww
429デフォルトの名無しさん
2022/03/07(月) 23:29:43.95ID:m7T5bZFc マクロ騒動で脳が破壊されてしまった子がいるね
430デフォルトの名無しさん
2022/03/07(月) 23:46:00.91ID:47rZ/1iq SEXの時は動かずにマグロになってしまったようですね
やっぱりロボトミー手術してよかったですね
やっぱりロボトミー手術してよかったですね
431デフォルトの名無しさん
2022/03/08(火) 21:56:42.93ID:A5UfccGR432デフォルトの名無しさん
2022/03/08(火) 22:58:13.81ID:2Ie6O3y5 はいはい、一人何役するのかねw
433デフォルトの名無しさん
2022/03/08(火) 23:19:40.19ID:lL5N1LvC >>432
我々ギフハブがいつも見ているぞ
我々ギフハブがいつも見ているぞ
434デフォルトの名無しさん
2022/03/10(木) 18:10:06.68ID:USdHjBxA テンプレートの可変長引数って一般的な実装だとスタックに積まれるの?
てことはあんまり大きいデータは渡せない?
てことはあんまり大きいデータは渡せない?
435デフォルトの名無しさん
2022/03/10(木) 18:17:21.80ID:6o5PvaaD template-parameter-packは実行環境では普通の引数と全く同じだ
翻訳中の解釈でどんな「普通の引数」にするか判断してるだけ
翻訳中の解釈でどんな「普通の引数」にするか判断してるだけ
436デフォルトの名無しさん
2022/03/10(木) 21:39:59.02ID:xy5Q90JZ 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段分のリターンアドレスとか諸々をスタックに積む
最適化ありコンパイルなら大体インライン展開されるからさほど大事にはならない
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段分のリターンアドレスとか諸々をスタックに積む
最適化ありコンパイルなら大体インライン展開されるからさほど大事にはならない
437デフォルトの名無しさん
2022/03/11(金) 07:47:35.25ID:GmBPyzdt #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
途中経過のテンプレートも全て関数実体として展開される
最適化すると、この例だと全部定数で計算されるけど
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
途中経過のテンプレートも全て関数実体として展開される
最適化すると、この例だと全部定数で計算されるけど
438デフォルトの名無しさん
2022/03/11(金) 08:12:59.76ID:GmBPyzdt 流石にちょっと説明追加しておきます。
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)で計算されます。
つまりすごい再起的に呼び出してバカ正直に壮絶な計算をするため、スタック消費も大きいということ。
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)で計算されます。
つまりすごい再起的に呼び出してバカ正直に壮絶な計算をするため、スタック消費も大きいということ。
439デフォルトの名無しさん
2022/03/11(金) 08:30:00.26ID:bj9xq9MP おれおれtemplateの例ですね。
440デフォルトの名無しさん
2022/03/11(金) 11:44:15.06ID:yxfxX1kD 普通はテンプレつかった可変引数でも、イニシャライザでforで回して足して終わりっしょ。
なぜ自分で再帰にして書くのやら。
なぜ自分で再帰にして書くのやら。
441デフォルトの名無しさん
2022/03/11(金) 12:14:25.50ID:GmBPyzdt >>440
一般には可変長テンプレート引数の型が一律とは限らないので
一般には可変長テンプレート引数の型が一律とは限らないので
442デフォルトの名無しさん
2022/03/11(金) 12:45:09.09ID:FGXUCKCr443デフォルトの名無しさん
2022/03/11(金) 19:55:16.89ID:XC1WHC10 constexprでやればいいじゃん
444デフォルトの名無しさん
2022/03/11(金) 19:58:15.85ID:bj9xq9MP なんでもtemplateにしたい病なんですよ。プロジェクトで一番迷惑なタイプです。
おれおれtemplateは可読性、保守性が一気に落ちるので勘弁してください。
おれおれtemplateは可読性、保守性が一気に落ちるので勘弁してください。
445デフォルトの名無しさん
2022/03/11(金) 20:09:30.59ID:rOwnBpGX 読む方は溜まったもんじゃないが書くのも実行速度もなんだかんだテンプレートが一番早いんで…
446デフォルトの名無しさん
2022/03/11(金) 21:26:30.13ID:FGXUCKCr >>444
純コンパイラ方式の言語を使ってるのに
中間コードを使わにゃならんところが出てくると
残念な気持ちにならん?
もっと極端に言うとアセンブラからBASICやBATを呼び出すようなこと
人それぞれで何も感じない人っているのかね
純コンパイラ方式の言語を使ってるのに
中間コードを使わにゃならんところが出てくると
残念な気持ちにならん?
もっと極端に言うとアセンブラからBASICやBATを呼び出すようなこと
人それぞれで何も感じない人っているのかね
447デフォルトの名無しさん
2022/03/11(金) 22:03:21.13ID:GmBPyzdt 例えばさっきのシーケンスをランダムな数字をその場で生成みたいな感じにすると、
#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にする?
#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にする?
448デフォルトの名無しさん
2022/03/11(金) 22:03:23.71ID:bj9xq9MP449デフォルトの名無しさん
2022/03/11(金) 22:52:13.11ID:GmBPyzdt ちなみに分けてテンプレートにしてみた。もう1レスに収まらないので消えたらごめんw
https://godbolt.org/z/YoxG7b4ro
https://godbolt.org/z/YoxG7b4ro
450デフォルトの名無しさん
2022/03/11(金) 23:14:03.97ID:GmBPyzdt #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;
}
#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;
}
451デフォルトの名無しさん
2022/03/12(土) 13:11:11.84ID:uDPm4ane 大学で下記のような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などの手動ループを使用しないこと。
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などの手動ループを使用しないこと。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国国営メディア「沖縄は日本ではない」… ★6 [BFU★]
- 高市政権にパイプ役不在…日中高まる緊張 公明党の連立離脱影響、自民内にも懸念「自分でまいた種は自分で刈り取ってもらわないと」★2 [ぐれ★]
- 【速報】 日経平均の下落率3%超す、財政懸念で長期金利上昇 [お断り★]
- ナイツ塙が指摘のローソンコーヒーカップ、ロゴ「L」で誤解生みデザイン変更へ 在庫使い切る3か月後にリニューアル [muffin★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 【速報】 高市政権、「日本版DOGE」を立ち上げ 米国で歳出削減をした「政府効率化省(DOGE)」になぞらえたもの [お断り★]
- 高市早苗「……なんて言ってみたw」中国「なんだ、言ってみただけかw」👈これで全部元通りになるという事実 [782460143]
- 【悲報】早速高市首相のせいで全国の民泊でキャンセルラッシュwwwwwwwwwwww 経営者も嘆き「こんな事は初めてだ…」😲 [871926377]
- 中国「高市が謝罪撤回しないとこれ全部なくなるけどどうする?」 [931948549]
- んなっしょい🍬禁止🈲のお🏡
- 映画「ゼルダの伝説」、リンクとゼルダ姫が白人になってしまう。日本のものは日本人だろうが!! [592058334]
- 高市早苗「株やってる奴ザマァwww格差是正のためにも、もっと暴落した方がいいよwww」(´・ω・`)確かに。 [252835186]
