前スレ
C++相談室 part156
https://mevius.5ch.net/test/read.cgi/tech/1621389313/
探検
C++相談室 part157
■ このスレッドは過去ログ倉庫に格納されています
2021/08/09(月) 10:57:31.60ID:JaaB5Egp
409デフォルトの名無しさん
2021/09/20(月) 07:51:13.46ID:l/aXhlvm スレタイも読めない、検索できないやつがまともなプログラム書けるはずもなく・・・
410デフォルトの名無しさん
2021/09/20(月) 07:52:13.05ID:Mm5TpRqo windows API使いたがるひとがいてめんどくさい
こっちはなるべく標準のc++使いたいのに
こっちはなるべく標準のc++使いたいのに
411デフォルトの名無しさん
2021/09/20(月) 08:19:53.25ID:VgAULHWI POSIXと比べるとクソ過ぎて話にならんよな
412デフォルトの名無しさん
2021/09/20(月) 10:01:57.22ID:LqQpPYvk プラットフォーム固有の話も参考になる
今回の流れは Win32 API と std::chrono の違いが端緒だしスレ違いというほどではない
今回の流れは Win32 API と std::chrono の違いが端緒だしスレ違いというほどではない
413デフォルトの名無しさん
2021/09/20(月) 10:48:50.60ID:T+6xg0LJ そのクソがなんで一番利用者多いのか考えてみろ
414デフォルトの名無しさん
2021/09/20(月) 11:24:41.17ID:VgAULHWI バカに合わせてるからだろ
言わせんなよ恥ずかしい
言わせんなよ恥ずかしい
415ハノン ◆QZaw55cn4c
2021/09/20(月) 11:26:09.83ID:+hQanlE4 私馬鹿よねーお馬鹿さんよねー今日も win32api
416デフォルトの名無しさん
2021/09/20(月) 11:30:28.88ID:DnvAIBnA とりあえず動かないから面白くないということなのかもなということで、Linuxのclock_gettimeにも対応しといた。
BSDとmac組は知らん。
https://ideone.com/Z9CfOo
一応WIN32はあえて低解像度のを計測してるという点だけは補足しておきます。
BSDとmac組は知らん。
https://ideone.com/Z9CfOo
一応WIN32はあえて低解像度のを計測してるという点だけは補足しておきます。
417デフォルトの名無しさん
2021/09/20(月) 12:15:53.36ID:rmuhdvcF timeBeginPeriod
木屋さん元気かな
木屋さん元気かな
418デフォルトの名無しさん
2021/09/20(月) 12:28:29.25ID:26DwFCZj 元の質問見てないけどQPCでええんちゃうの
419デフォルトの名無しさん
2021/09/20(月) 12:45:29.78ID:DnvAIBnA >>417
スレッドのスケジューリングも変化するので注意です。
tickとはそもそもそういうものでしたが。
http://archive.linux.or.jp/JF/JFdocs/The-Linux-Kernel-20.html
>>418
>>395でそう言ったし、high_resolution_clockで使用されてるのもそれ
スレッドのスケジューリングも変化するので注意です。
tickとはそもそもそういうものでしたが。
http://archive.linux.or.jp/JF/JFdocs/The-Linux-Kernel-20.html
>>418
>>395でそう言ったし、high_resolution_clockで使用されてるのもそれ
420デフォルトの名無しさん
2021/09/20(月) 12:51:33.23ID:VgAULHWI CreateWaitableTimerEx(NULL,NULL,CREATE_WAITABLE_TIMER_HIGH_RESOLUTION,TIMER_ALL_ACCESS)
421デフォルトの名無しさん
2021/09/20(月) 13:22:11.61ID:DnvAIBnA422デフォルトの名無しさん
2021/09/20(月) 13:58:28.71ID:VgAULHWI バカか
計測するなら精度高めないと意味ないだろ
計測するなら精度高めないと意味ないだろ
423デフォルトの名無しさん
2021/09/20(月) 14:31:11.65ID:LO5PkHvF そもそもパフォーマンスの計測に使うなんて言ってなくない?
424デフォルトの名無しさん
2021/09/20(月) 16:05:39.48ID:DnvAIBnA >>422
この例はExついてないけど、こういう使い方をするものなんだよ。
待機可能タイマー オブジェクトの使用 - Win32 apps | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows/win32/sync/using-waitable-timer-objects
>>423
>>388で求めているのは正確には時刻取得だね。つまりsystem_clockの話。
俺がしてるのは時間計測なのでsteady_clockの話。
違いは時刻の修正などにより増減するかしないかという特性の違いと、それを実現するHWタイマの分解能/性能の違い。
GetLocalTimeの分解能は文書にも記述がなく、>>393の指摘だけで事実関係が不明なまま宙に浮いてたので、>>416などでそれを計測した。
ここでは10〜15.6msの出元であるGetTickCountもついでに計測した。
steady_clockとsystem_clockをどこかで同時に取得して、steady_clockの分解能のまま時刻っぽいものを得るみたいなことも短期的には現実的な精度でできなくはないけど。
この例はExついてないけど、こういう使い方をするものなんだよ。
待機可能タイマー オブジェクトの使用 - Win32 apps | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows/win32/sync/using-waitable-timer-objects
>>423
>>388で求めているのは正確には時刻取得だね。つまりsystem_clockの話。
俺がしてるのは時間計測なのでsteady_clockの話。
違いは時刻の修正などにより増減するかしないかという特性の違いと、それを実現するHWタイマの分解能/性能の違い。
GetLocalTimeの分解能は文書にも記述がなく、>>393の指摘だけで事実関係が不明なまま宙に浮いてたので、>>416などでそれを計測した。
ここでは10〜15.6msの出元であるGetTickCountもついでに計測した。
steady_clockとsystem_clockをどこかで同時に取得して、steady_clockの分解能のまま時刻っぽいものを得るみたいなことも短期的には現実的な精度でできなくはないけど。
425デフォルトの名無しさん
2021/09/25(土) 05:50:44.21ID:B+D0wTVh 3種類ぐらいのタイマの時刻が1000回変化するのに要するトータル時間Tを測っているらしいが
この計測結果からSYSTEMTIMEの分解能がHWタイマの分解能/性能の違いに起因すると結論づけることはできない
実態は>>375な計り方でst1: SYSTEMTIME、now: nowtime_point、st2: SYSTEMTIME、の順で立て続けに時間をとると
>>388の通り
st1 ≦ now && now ≦ st2 + 1 ms
という結果なわけで、この「1 ms(<15.6 ms)というのは本当にハードウェアタイマの分解能なんかい話が違うぞ?!」と詰問されて
答えに窮する>>424な未来が見える見えまくり
この計測結果からSYSTEMTIMEの分解能がHWタイマの分解能/性能の違いに起因すると結論づけることはできない
実態は>>375な計り方でst1: SYSTEMTIME、now: nowtime_point、st2: SYSTEMTIME、の順で立て続けに時間をとると
>>388の通り
st1 ≦ now && now ≦ st2 + 1 ms
という結果なわけで、この「1 ms(<15.6 ms)というのは本当にハードウェアタイマの分解能なんかい話が違うぞ?!」と詰問されて
答えに窮する>>424な未来が見える見えまくり
426デフォルトの名無しさん
2021/09/25(土) 05:55:32.54ID:B+D0wTVh427デフォルトの名無しさん
2021/09/25(土) 06:02:51.16ID:B+D0wTVh ごめ、Sleep(1000)を入れたのではOSにプリエンプションの機会を与えてしまうからNG
正しくは
GetSystemTime(&st1);
15.6 ms未満のビジーループ <== 訂正
now = system_clock::now();
GetSystemTime(&st2);
とすると、
st1 ≦ now && now ≦ st2 + 15.6 ms
にnowの精度が劣化する、に訂正
OSのAPIもプリエンプションの機会にならない保証が無いのでビジーループはガチでビジーループで作る必要があり、
面倒なのでやらないがな!
正しくは
GetSystemTime(&st1);
15.6 ms未満のビジーループ <== 訂正
now = system_clock::now();
GetSystemTime(&st2);
とすると、
st1 ≦ now && now ≦ st2 + 15.6 ms
にnowの精度が劣化する、に訂正
OSのAPIもプリエンプションの機会にならない保証が無いのでビジーループはガチでビジーループで作る必要があり、
面倒なのでやらないがな!
428デフォルトの名無しさん
2021/09/25(土) 07:18:10.24ID:B+D0wTVh といいつつAPIに頼らずに10 ms規模のビジーループ(ビジーウェイト)させるのはやや技巧を要すると思ったので漏れが自らやってやった、
https://ideone.com/CjXN4X
※ 計測の実行は要Windows
結果、1 ms、8 ms、16 ms、1秒のどれに変えても>>388と同じで、
std::chrono::now()の時刻nowに対し、その直後にGetSystemTime()で得た時刻st2が
1 msだけ追い越されることはあっても決して 1 msより大きく追い越されることは無かったorz
なぜじゃ闇が深いなこれ、
もちろんGetSystemTime()ではなくGetSystemTimePreciseAsFileTime()を使う(↑のソースコードのPRECISE_AS_FILETIMEマクロ定義を有効化する
と>>398の通りドンピシャな時刻順になる点はビジーウェイトがあっても変わらない。
GetSystemTime()のふるまいが一方的に謎杉
https://ideone.com/CjXN4X
※ 計測の実行は要Windows
結果、1 ms、8 ms、16 ms、1秒のどれに変えても>>388と同じで、
std::chrono::now()の時刻nowに対し、その直後にGetSystemTime()で得た時刻st2が
1 msだけ追い越されることはあっても決して 1 msより大きく追い越されることは無かったorz
なぜじゃ闇が深いなこれ、
もちろんGetSystemTime()ではなくGetSystemTimePreciseAsFileTime()を使う(↑のソースコードのPRECISE_AS_FILETIMEマクロ定義を有効化する
と>>398の通りドンピシャな時刻順になる点はビジーウェイトがあっても変わらない。
GetSystemTime()のふるまいが一方的に謎杉
429デフォルトの名無しさん
2021/09/25(土) 08:12:02.95ID:HzR9ZlyY WinAPIスレに持っていってくれますか?
結局<chrono>に固有の問題(?)ではなくて背後のAPI関数に関することって分かったはずなんで
結局<chrono>に固有の問題(?)ではなくて背後のAPI関数に関することって分かったはずなんで
430デフォルトの名無しさん
2021/09/25(土) 08:44:57.34ID:HzR9ZlyY とか言いつつ自分で探してきたので貼っちゃう……
GetSystemTimeの分解能が15.6msというのはXPまでの話らしい
https://www.thedelphigeek.com/2007/10/calculating-accurate.html
GetSystemTimeの分解能が15.6msというのはXPまでの話らしい
https://www.thedelphigeek.com/2007/10/calculating-accurate.html
431デフォルトの名無しさん
2021/09/25(土) 09:20:27.88ID:ZWKkb85T432デフォルトの名無しさん
2021/09/25(土) 17:45:16.21ID:+JZgAVsh > プリエンプションの機会
機会を与えないことができるのは昔のWindowsだろ
機会を与えないことができるのは昔のWindowsだろ
433デフォルトの名無しさん
2021/09/25(土) 18:35:43.94ID:8CcFj4Yb 今だって邪魔できるよ
消極的ではあるけど
消極的ではあるけど
434デフォルトの名無しさん
2021/09/25(土) 18:44:00.64ID:+JZgAVsh 割り込み禁止命令が実行できたり
割り込みコントローラにコマンド出せたりする
デバドラかMODESETみたいのないと無理だよ
割り込みコントローラにコマンド出せたりする
デバドラかMODESETみたいのないと無理だよ
435デフォルトの名無しさん
2021/09/26(日) 12:46:15.93ID:9lvhFgGq std::complex<double> の変数 a, b について、OpenMP の並列リージョン内での
#pragma omp atomic
a += b;
が
error: invalid expression type for '#pragma omp atomic'
というエラーを出すんですが、std::complex はアトミック演算の対象外ですか?
それとも他の何かを見落としてる可能性がある?
#pragma omp atomic
a += b;
が
error: invalid expression type for '#pragma omp atomic'
というエラーを出すんですが、std::complex はアトミック演算の対象外ですか?
それとも他の何かを見落としてる可能性がある?
436デフォルトの名無しさん
2021/09/26(日) 13:03:13.46ID:4UIlewCz ompのAPI仕様書を読むと対象はスカラー型のみって書いてあるから対象外なんじゃないの?
437デフォルトの名無しさん
2021/09/26(日) 13:04:21.25ID:4UIlewCz ここのx and vってとこ
https://www.openmp.org/spec-html/5.0/openmpsu95.html
https://www.openmp.org/spec-html/5.0/openmpsu95.html
438デフォルトの名無しさん
2021/09/26(日) 13:07:22.68ID:9lvhFgGq 数学とか物理の用語としては複素数はスカラーですが、コンピューター用語としては違うんでしたっけ?
439デフォルトの名無しさん
2021/09/26(日) 13:18:19.13ID:loHIOGgF 確かモルダーを疲れさせる女のこと
440デフォルトの名無しさん
2021/09/26(日) 13:28:55.11ID:pztAGZv/ 対象外
ぷりみ恥部とPOD以外だめ
ぷりみ恥部とPOD以外だめ
441デフォルトの名無しさん
2021/09/26(日) 14:59:44.58ID:4UIlewCz >>438
std::complexはclass型だよ。c++では
std::complexはclass型だよ。c++では
442デフォルトの名無しさん
2021/09/26(日) 15:02:24.84ID:9lvhFgGq443はちみつ餃子 ◆8X2XSCHEME
2021/09/27(月) 00:54:20.59ID:vtQXnC4F >>438
C++ におけるスカラ型の定義
・ 算術型 (整数型と浮動小数点数型)
・ 列挙型
・ ポインタ型
・ メンバへのポインタ型
・ std::nullptr_t
・ 以上を cv 修飾 (const や volatile で修飾) したもの
https://timsong-cpp.github.io/cppwp/n3337/basic.types#9
言語によって定義は異なっている (または定義を持たない) ので
コンピューター用語として一般化は出来ないと思う。
C++ におけるスカラ型の定義
・ 算術型 (整数型と浮動小数点数型)
・ 列挙型
・ ポインタ型
・ メンバへのポインタ型
・ std::nullptr_t
・ 以上を cv 修飾 (const や volatile で修飾) したもの
https://timsong-cpp.github.io/cppwp/n3337/basic.types#9
言語によって定義は異なっている (または定義を持たない) ので
コンピューター用語として一般化は出来ないと思う。
444デフォルトの名無しさん
2021/09/27(月) 06:07:00.04ID:vzE92GBt ここはC++スレだからC++用語で必要充分だ
無理に一般化する必要はない
無理に一般化する必要はない
445デフォルトの名無しさん
2021/09/27(月) 08:56:19.98ID:P6ytpwfT 複素数が「算術型」じゃないのって冷静に考えるの結構奇妙だな
446デフォルトの名無しさん
2021/09/27(月) 19:18:30.57ID:LR1S7vXs 複素数を直接扱う命令がないCPUが多い以上、小数2個で表される複素数がスカラではないのは自然だと思うけど
それを言い出すと、一般線形群と呼ばれる行列はなんでも算術型になるのではないか?と思えてくるし
それを言い出すと、一般線形群と呼ばれる行列はなんでも算術型になるのではないか?と思えてくるし
447デフォルトの名無しさん
2021/09/27(月) 19:25:38.25ID:n9hc+rIL arithmeticを「算術」とか仰々しく訳すからおかしくなる
要は小学生がさんすうで習うような単純な数のことよ
要は小学生がさんすうで習うような単純な数のことよ
448デフォルトの名無しさん
2021/09/27(月) 22:16:24.75ID:D7AKGDxr そもそも数学でも複素数はスカラじゃないよな
449デフォルトの名無しさん
2021/09/27(月) 22:19:03.53ID:sGjfmd1K ベクトルの係数になるんだから基本的にスカラじゃねえの
450デフォルトの名無しさん
2021/09/27(月) 22:43:23.51ID:PI7czi9F スカラーだったりベクトルだったりするらしい
http://izumi-math.jp/K_Manabe/what_v/what_v_3.htm
http://izumi-math.jp/K_Manabe/what_v/what_v_3.htm
451デフォルトの名無しさん
2021/09/27(月) 22:51:45.61ID:GPisoDJi 複素ベクトル空間の係数体の元として見ればスカラだし複素数体を実ベクトル空間と見れば複素数は実ベクトル
452デフォルトの名無しさん
2021/09/28(火) 07:58:37.24ID:ZoUlFxaV 除算が定義できる体なので普通はスカラーとして扱うと思うけどな。
2要素の実ベクトルや2自由度の行列に適切な演算を導入することによって同一視することはできる。
2要素の実ベクトルや2自由度の行列に適切な演算を導入することによって同一視することはできる。
453デフォルトの名無しさん
2021/09/29(水) 10:21:13.97ID:QYKzykPR >>447
要は小学生がさんすうで習うような単純な数のことを「算術」と言うんだが
要は小学生がさんすうで習うような単純な数のことを「算術」と言うんだが
454ハノン ◆QZaw55cn4c
2021/09/29(水) 18:51:49.92ID:+NS+8RdU455デフォルトの名無しさん
2021/09/29(水) 19:37:07.20ID:F6bYTA4Q 好きなX^2=-Iを満たす行列Xを用意すればaI+bXが複素数の表現になるよ
456デフォルトの名無しさん
2021/09/30(木) 04:33:42.15ID:a96KQdEj457デフォルトの名無しさん
2021/09/30(木) 10:27:42.19ID:rsDh5L5E i 0
0 i
0 i
458デフォルトの名無しさん
2021/09/30(木) 12:07:05.65ID:CrfxKotF 複素数z=x+iy (x, y:実数)とした場合どうやって行列で表現できるのか分からん
そもそも無理だろ
そもそも無理だろ
459デフォルトの名無しさん
2021/09/30(木) 12:15:59.67ID:LH+TfD4u いい加減スレチだぞお前ら
460デフォルトの名無しさん
2021/09/30(木) 12:39:55.75ID:HqpdIwHE 複素数の実行列表現あたりで調べれば出てくるから自分で調べろ。
複素数ライブラリの実装は行列表現だろ。
複素数ライブラリの実装は行列表現だろ。
461デフォルトの名無しさん
2021/09/30(木) 14:36:41.46ID:rqtJMe+2 承認欲求が満たされなかったキチガイのハ◯ンが荒らしてるんだな
462ハノン ◆QZaw55cn4c
2021/09/30(木) 21:06:22.87ID:SS5VJirH463デフォルトの名無しさん
2021/09/30(木) 22:32:11.42ID:hyVGcxZ+ 複素数ライブラリの実装が行列表現な訳ないだろ
464デフォルトの名無しさん
2021/10/01(金) 04:28:27.07ID:YSb3+a7i パウリ行列やで
465デフォルトの名無しさん
2021/10/01(金) 08:55:53.93ID:wyBR1P+Z それは四元数では
466デフォルトの名無しさん
2021/10/01(金) 11:45:26.96ID:o+E+DUKy そもそも勝手な演算❎とかを用意して、それを複素数の演算になるような演算規則にすればいいだけの話
普通のプログラミング言語での実装は2要素ベクトルに対して複素数積となるような演算を*に対応させているんだと思うけどな
行列積が複素数の積と同一視できるような表現行列があるというだけ
群論とか環論とか体論とか入門的にでもやればわかるよ
普通のプログラミング言語での実装は2要素ベクトルに対して複素数積となるような演算を*に対応させているんだと思うけどな
行列積が複素数の積と同一視できるような表現行列があるというだけ
群論とか環論とか体論とか入門的にでもやればわかるよ
467デフォルトの名無しさん
2021/10/02(土) 13:55:46.16ID:cR/mfYmg ベクトルの要素は座標変換で変わるからスカラーではない
468デフォルトの名無しさん
2021/10/02(土) 13:59:33.99ID:cR/mfYmg まつがえたorz
誤: 変わるから
正: 変化すっから
誤: 変わるから
正: 変化すっから
469デフォルトの名無しさん
2021/10/02(土) 14:34:20.70ID:7v0dyN4q 物理屋さんか?
470デフォルトの名無しさん
2021/10/02(土) 14:56:43.55ID:cR/mfYmg んまーたしかに物理現象は座標変換しても変わらない(同じもの)とみなすのが
物理の先生なのかもしれん スカラーもそん延長線上の概念
しかし観測が系に影響を与えると言い出した時点でいつまで真理でありつづけることやら……
物理の先生なのかもしれん スカラーもそん延長線上の概念
しかし観測が系に影響を与えると言い出した時点でいつまで真理でありつづけることやら……
471デフォルトの名無しさん
2021/10/02(土) 20:42:45.96ID:xJ5F1jwy >>467
言葉足らずだったかもしれないが、複素数体と数学的にはR2の正規直交基底かつ基底の長さが1のベクトルの成分表示を、適切な演算を入れることによって同一視することができるという話をしているのであって、一般的なベクトル空間の話をしている訳ではない。
言葉足らずだったかもしれないが、複素数体と数学的にはR2の正規直交基底かつ基底の長さが1のベクトルの成分表示を、適切な演算を入れることによって同一視することができるという話をしているのであって、一般的なベクトル空間の話をしている訳ではない。
472デフォルトの名無しさん
2021/10/02(土) 21:15:26.25ID:cR/mfYmg スカラーか否かというのは数をどこに使うかの話であって
数をどう表現するかの話ではないし、
数をどう表現するかの話ではないし、
473デフォルトの名無しさん
2021/10/02(土) 21:16:10.17ID:cR/mfYmg それはそうとしてR^2と言っただけでは計量が入っていないから(平行移動も糞も無いため)ベクトル空間ではない
つまり { ベクトル空間 } ⊂ { R^2 } であってR^2の方がより一般的
R^2上で実数と同じ7つの演算則を満たす演算を形式的に定義することはできるが|i|=1を表すために
>正規直交基底かつ基底の長さが1のベクトルの成分表示
が必要になるから複素数体を正確に言い表すにはR^2ではなくてユークリッド空間か何かが要ることになるんじゃないの
つまり { ベクトル空間 } ⊂ { R^2 } であってR^2の方がより一般的
R^2上で実数と同じ7つの演算則を満たす演算を形式的に定義することはできるが|i|=1を表すために
>正規直交基底かつ基底の長さが1のベクトルの成分表示
が必要になるから複素数体を正確に言い表すにはR^2ではなくてユークリッド空間か何かが要ることになるんじゃないの
474デフォルトの名無しさん
2021/10/02(土) 22:42:32.17ID:5uoG6j9g 加法(V × V → V)と係数体による倍演算(K × V → V)が入ってて線型ならベクトル空間だよ, 計量入れたら計量ベクトル空間
475デフォルトの名無しさん
2021/10/05(火) 17:00:23.30ID:YgA3J5wy 関数の引数に参照渡しで何も渡さないようにするはどうすればよいですか
自作クラスAがあったとして、それを引数にとる関数
void hoge(int& p1, A& p2)
があります。
ただ、p2は、ケースによっては要らない場合もあって、その場合にはどうすればよいですか。
調べてみたらnullptrみたいなのはあったので、
int p1 = 1;
hoge(p1, nullptr);
と書いてみても、
非constの左辺が何とかとエラーが出て、渡せませんでした。
自作クラスAがあったとして、それを引数にとる関数
void hoge(int& p1, A& p2)
があります。
ただ、p2は、ケースによっては要らない場合もあって、その場合にはどうすればよいですか。
調べてみたらnullptrみたいなのはあったので、
int p1 = 1;
hoge(p1, nullptr);
と書いてみても、
非constの左辺が何とかとエラーが出て、渡せませんでした。
476デフォルトの名無しさん
2021/10/05(火) 17:34:05.28ID:lBT+65cn *nullptr
477はちみつ餃子 ◆8X2XSCHEME
2021/10/05(火) 17:41:01.80ID:krkmojOq >>475
参照は何も参照していない状態というのは作れない。
参照で受け取るように書いてあればその参照が無効ということはあり得ないという表明として解釈するのが通例。
(実際にはダングリング参照はあり得るけどそれは単に間違ったプログラムなので気にしない。)
引数として不要なのであればオーバーロードで引数が不要な関数も用意するのが真っ当な方法だけれど、
どうしても無効ということを表す状態を渡したいということであればダミーのオブジェクトを作っておいて
それを無効の意味に使うという方法は考えられる。 (不格好だけど……。)
#include <iostream>
struct A {};
A dummy;
void hoge(int& p1, A& p2 = dummy) {
if(&dummy == &p2) std::cout << "p2 is dummy" << std::endl;
else std::cout << "p2 is not dummy" << std::endl;
}
int main(void) {
int foo = 1;
A bar;
hoge(foo, bar);
hoge(foo);
}
あるいは std::variant と std::monostate と std::ref を組み合わせれば表現できなくもないかなぁ……。
参照は何も参照していない状態というのは作れない。
参照で受け取るように書いてあればその参照が無効ということはあり得ないという表明として解釈するのが通例。
(実際にはダングリング参照はあり得るけどそれは単に間違ったプログラムなので気にしない。)
引数として不要なのであればオーバーロードで引数が不要な関数も用意するのが真っ当な方法だけれど、
どうしても無効ということを表す状態を渡したいということであればダミーのオブジェクトを作っておいて
それを無効の意味に使うという方法は考えられる。 (不格好だけど……。)
#include <iostream>
struct A {};
A dummy;
void hoge(int& p1, A& p2 = dummy) {
if(&dummy == &p2) std::cout << "p2 is dummy" << std::endl;
else std::cout << "p2 is not dummy" << std::endl;
}
int main(void) {
int foo = 1;
A bar;
hoge(foo, bar);
hoge(foo);
}
あるいは std::variant と std::monostate と std::ref を組み合わせれば表現できなくもないかなぁ……。
478デフォルトの名無しさん
2021/10/05(火) 17:45:03.34ID:UD2fraRe NullObjectパターンすね
479デフォルトの名無しさん
2021/10/05(火) 17:48:18.95ID:lBT+65cn hoge(p1,* static_cast<A*>(nullptr));
480デフォルトの名無しさん
2021/10/05(火) 17:49:14.63ID:3jRalumJ481はちみつ餃子 ◆8X2XSCHEME
2021/10/05(火) 17:52:23.11ID:krkmojOq482デフォルトの名無しさん
2021/10/05(火) 19:00:16.73ID:lBT+65cn 何いってんだ
キチンと動作する
ただの参照なんだから未定義じゃないだろ
他の変数に受け渡してるワケでもないし
キチンと動作する
ただの参照なんだから未定義じゃないだろ
他の変数に受け渡してるワケでもないし
483はちみつ餃子 ◆8X2XSCHEME
2021/10/05(火) 19:59:32.04ID:krkmojOq >>482
実質的な (コンパイルされた後の) 動作として値を取り出す必要がないというのは、
言語仕様上において * の適用を無かったことに出来るわけではない。
(C には単項 * の結果に単項 & を適用した場合に相殺されてどちらも無かったことになる規則があるが……。)
実質的な (コンパイルされた後の) 動作として値を取り出す必要がないというのは、
言語仕様上において * の適用を無かったことに出来るわけではない。
(C には単項 * の結果に単項 & を適用した場合に相殺されてどちらも無かったことになる規則があるが……。)
484デフォルトの名無しさん
2021/10/05(火) 20:26:29.70ID:SwNxahaG また未定義動作なんか怖くない君か
命知らずなのはいいけどチームプログラミングには関わらないでね本当に迷惑だから
命知らずなのはいいけどチームプログラミングには関わらないでね本当に迷惑だから
485デフォルトの名無しさん
2021/10/05(火) 20:32:26.64ID:7rL/DhC7 1. 参照をやめてポインタにする
2. std::optional<T>を使う(C++17以降)
俺ならこのどっちか
2. std::optional<T>を使う(C++17以降)
俺ならこのどっちか
486デフォルトの名無しさん
2021/10/05(火) 22:18:37.99ID:bhHmmGon487デフォルトの名無しさん
2021/10/05(火) 22:24:32.10ID:bhHmmGon もちろんT固有のnull「値」の定義においては
オブジェクトの参照 == null値、
はアドレスの一致ではなく値の一致として解釈されねばならな
い
オブジェクトの参照 == null値、
はアドレスの一致ではなく値の一致として解釈されねばならな
い
488デフォルトの名無しさん
2021/10/05(火) 22:44:53.78ID:bhHmmGon さもないと、クラスTのnull値をT_NULLみたいな名前にしたとして、
T arr[] = { T_NULL, T_NULL, T_NULL, T_NULL };
みたいなことができないか
らな
T arr[] = { T_NULL, T_NULL, T_NULL, T_NULL };
みたいなことができないか
らな
489デフォルトの名無しさん
2021/10/06(水) 00:36:12.25ID:meWA0K5y >>480,482
gcc 11 の -O2 で「&p2==nullptrでnullptrが渡されたかどうかチェック」はできなかった。
https://wandbox.org/permlink/c9QQIkFRPpFHd7rL
gcc 11 の -O2 で「&p2==nullptrでnullptrが渡されたかどうかチェック」はできなかった。
https://wandbox.org/permlink/c9QQIkFRPpFHd7rL
490デフォルトの名無しさん
2021/10/06(水) 00:55:04.49ID:E9G/hK4q void hoge(int& p1, optional<A>& p2 = nullopt) { // constじゃないのでエラー
みたいなことってoptionalで上手いことやる方法ないの?
呼び出し元は
int i;
A a;
hoge(i, a);
hoge(i);
みたいな感じで
書き換えられるけどhogeから抜けたら消える初期値nulloptのoptional<A>をデフォルト値で渡せるのか知りたい
みたいなことってoptionalで上手いことやる方法ないの?
呼び出し元は
int i;
A a;
hoge(i, a);
hoge(i);
みたいな感じで
書き換えられるけどhogeから抜けたら消える初期値nulloptのoptional<A>をデフォルト値で渡せるのか知りたい
491デフォルトの名無しさん
2021/10/06(水) 01:23:25.11ID:V3EBITWg なにいってんだおめ
492デフォルトの名無しさん
2021/10/06(水) 01:31:37.67ID:V3EBITWg nullopt以外が渡されたらそのA&に対して、
nulloptが渡されたらスタックにAを構築したうえでそのA&に対して操作したい、ってこと?
それはvoid hoge(int& p1, A& p2 = デフォルト値)でいけるんじゃないかい
nulloptが渡されたらスタックにAを構築したうえでそのA&に対して操作したい、ってこと?
それはvoid hoge(int& p1, A& p2 = デフォルト値)でいけるんじゃないかい
493デフォルトの名無しさん
2021/10/06(水) 01:49:32.28ID:E9G/hK4q 伝わらないようなので、コード書きました
https://wandbox.org/permlink/HyOX0jEBR4glCT01
https://wandbox.org/permlink/HyOX0jEBR4glCT01
494はちみつ餃子 ◆8X2XSCHEME
2021/10/06(水) 03:08:52.59ID:3d8zh1Pt >>493
やりたいことは std::optional<A>& ではなくて std::optional<A&> 的なことだろ。
しかし std::optional は参照を保持できないのでそういうときのために std::reference_wrapper がある。
コードにしたらこんな感じ。
https://wandbox.org/permlink/qEaoGDWFh7LmzE4m
やりたいことは std::optional<A>& ではなくて std::optional<A&> 的なことだろ。
しかし std::optional は参照を保持できないのでそういうときのために std::reference_wrapper がある。
コードにしたらこんな感じ。
https://wandbox.org/permlink/qEaoGDWFh7LmzE4m
495デフォルトの名無しさん
2021/10/06(水) 06:31:33.91ID:lNsYT/rw 部分特殊化できないのは関数テンプレートだよな
template<class T1, class T2>
struct test {
void fig1();
void fig2();
void fig3();
};
template< > void test<void, void>::fig1(); //ok
template<class T1> void test<T1 , void>::fig2(); //error
template<class T2> void test<void, T2 >::fig3(); //error
クラステンプレートなのに弾かれるのは何で?
template<class T1, class T2>
struct test {
void fig1();
void fig2();
void fig3();
};
template< > void test<void, void>::fig1(); //ok
template<class T1> void test<T1 , void>::fig2(); //error
template<class T2> void test<void, T2 >::fig3(); //error
クラステンプレートなのに弾かれるのは何で?
496デフォルトの名無しさん
2021/10/06(水) 06:43:32.28ID:Cv4NDZSF その部分特殊化されたtest(構造体)が定義されてないからだね
先にtestの部分特殊化を書けば通る
先にtestの部分特殊化を書けば通る
497デフォルトの名無しさん
2021/10/06(水) 07:59:10.51ID:E9G/hK4q >>494
std::reference_wrapperは知りませんでした
std::optional<A>をstd::optional<A*>にしてconstのままいじれるようにした気分なので
実質無理ってことなのかなぁと思いますが…
ありがとうございます
std::reference_wrapperは知りませんでした
std::optional<A>をstd::optional<A*>にしてconstのままいじれるようにした気分なので
実質無理ってことなのかなぁと思いますが…
ありがとうございます
498デフォルトの名無しさん
2021/10/06(水) 08:17:01.00ID:fON1wZ9Y >>475
普通はオーバーロードだな。デフォルトを指定させたいのならnullobjectを始めとする定数オブジェクトかね。
nullポインタとか空のスマートポインタとかはエラーの元だから避けたいところ。
普通はオーバーロードだな。デフォルトを指定させたいのならnullobjectを始めとする定数オブジェクトかね。
nullポインタとか空のスマートポインタとかはエラーの元だから避けたいところ。
499デフォルトの名無しさん
2021/10/06(水) 08:26:08.77ID:E9G/hK4q500デフォルトの名無しさん
2021/10/06(水) 08:34:45.86ID:4yqQ2QZ4 今は継承はなるべく使わない、がデフォなのかな
501デフォルトの名無しさん
2021/10/06(水) 09:11:04.83ID:lTl3I+RT クラステンプレートがナウい
502デフォルトの名無しさん
2021/10/06(水) 09:13:14.40ID:lTl3I+RT とはいえ、いきなりテンプレートにするのはハードル高いので、
結局は、継承クラスをいくつか作ってみてテンプレート化を試すことになる
結局は、継承クラスをいくつか作ってみてテンプレート化を試すことになる
503デフォルトの名無しさん
2021/10/06(水) 09:41:21.39ID:DE23Rkof504デフォルトの名無しさん
2021/10/06(水) 10:03:37.43ID:7OUEgWer505デフォルトの名無しさん
2021/10/06(水) 10:45:35.19ID:Cv4NDZSF デフォとかナウいとかアホかと
506デフォルトの名無しさん
2021/10/06(水) 12:20:32.60ID:iqYhGyd9 最適化オプションの違いで挙動が変わるようなコードはそもそもダメだって理解してくれよ
507デフォルトの名無しさん
2021/10/06(水) 13:11:05.10ID:BBSbIN5v インテルコンパイラはもう規格満たしてないだろってくらい滅茶苦茶に挙動を変える
gccなら、最適化で結果が変わるようなコードはダメコードと言って良いと思う
gccなら、最適化で結果が変わるようなコードはダメコードと言って良いと思う
508デフォルトの名無しさん
2021/10/08(金) 05:56:22.58ID:Xasiu/5n >>496
遅レスすまそ
testなら部分特殊化できるのはわかるんだが
その場合クラス定義の全部を書き直すよな
template<class T1>
struct test<T1, void>
{
void fig1();
void fig2(); //特殊化したいのはここだけ
void fig3();
};
fig1とfig3を一次テンプレートと同じ内容で
書き直さにゃならんかね
遅レスすまそ
testなら部分特殊化できるのはわかるんだが
その場合クラス定義の全部を書き直すよな
template<class T1>
struct test<T1, void>
{
void fig1();
void fig2(); //特殊化したいのはここだけ
void fig3();
};
fig1とfig3を一次テンプレートと同じ内容で
書き直さにゃならんかね
509デフォルトの名無しさん
2021/10/08(金) 23:05:08.47ID:xNy0cJty 関数テンプレート内でラムダ式使おうとしたらコンパイルできない
template<class T> void hoge(){
auto func = [](){return 0;};
}
int main(){
hoge<int>();
return 0;
}
in instantiation of function template specialization 'hoge<int>' requested here
と出るが、何がだめなのかよくわからん
template<class T> void hoge(){
auto func = [](){return 0;};
}
int main(){
hoge<int>();
return 0;
}
in instantiation of function template specialization 'hoge<int>' requested here
と出るが、何がだめなのかよくわからん
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★10 [ぐれ★]
- ネット殺到「高市総理の責任」「完全に高市リスク」「高市さん負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 [樽悶★]
- トランプ氏「台湾侵攻すれば北京爆撃」“過激予告発言”報道がXで再燃「高市氏の1億倍やばい」 [七波羅探題★]
- 【為替】対ドルで157円台、対ユーロ181円台に下落 財政悪化を警戒 [蚤の市★]
- 【自民党】鈴木宗男議員「日本側はわざわざ中国に行ったということは、歩み寄るための行動で、頭を下げるのが仕事である」 [樽悶★]
- 【ペルソナ・ノン・グラータ】中国総領事の早期国外退去を首相に要請へ 自民・保守系グループ「日本の尊厳と国益を護(まも)る会」 [ぐれ★]
- 中国報道、高市首相を「毒苗」と中傷😡 [399259198]
- 【高市悲報】🇨🇳中国「日本への報復措置? 他にいくらでも方法はある。 まだまだやめないよ」 😨😱 [485983549]
- でも韓国ドラマに出てる女優って美人多いよな
- 安倍晋三さん、完全にチェックアウトしてしまう…「母の部屋に安倍元首相が表紙の旧統一教会の機関誌があった」 [405019576]
- 【悲報】日本、パンダ0にwwwwwwwwwwww高市さんありがとう🐼 [271912485]
- 高市早苗、約1ヶ月でドル円・10円円安を達成 [256556981]
