[過去ログ]
C++相談室 part165 (1002レス)
C++相談室 part165 http://mevius.5ch.net/test/read.cgi/tech/1698705458/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
70: デフォルトの名無しさん (ワッチョイ b501-sZSb) [sage] 2023/12/05(火) 12:48:03.77 ID:E3GJtsiR0 巷のスマートポインタはoperator*で参照型を返すので 生ポインタも同じかと思ってたよ http://mevius.5ch.net/test/read.cgi/tech/1698705458/70
71: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-By03) [sage] 2023/12/05(火) 13:28:25.92 ID:z5PiblaY0 互換性の都合とかがあるから仕方ないね。 場合分けが大量にあって単純な一般原則の組み合わせにはなってないから仕様を読み解くのがしんどい…… http://mevius.5ch.net/test/read.cgi/tech/1698705458/71
72: デフォルトの名無しさん (ワッチョイ 9f1f-oseA) [sage] 2023/12/11(月) 15:17:51.77 ID:7vxydTfj0 ある構造体Aがあります Aの比較関数が複数ありますcompA0,compA1,compA2,... 比較関数の関数ポインタがありますcompA compA = &compA2; 別の構造体Bがあります BはAを内包しています struct B{ A a; ... }; この構造体Bを、Aの比較関数ポインタcompAで比較してソートするにはどう記述すればよいですか? std::vector<B> bs; bs.push_back(...);... std::sort(bs.begin(),bs.end(),?); できればラムダ式を使わずにできるとありがたいです http://mevius.5ch.net/test/read.cgi/tech/1698705458/72
73: デフォルトの名無しさん (ブーイモ MM5b-oUR/) [sage] 2023/12/11(月) 15:22:02.06 ID:F1R6HyeLM >>72 ラムダ式使った方が良いと思うけど本当にラムダ式なしが良い? http://mevius.5ch.net/test/read.cgi/tech/1698705458/73
74: デフォルトの名無しさん (ワッチョイ 9f1f-oseA) [sage] 2023/12/11(月) 15:29:19.94 ID:7vxydTfj0 使われると、ラムダ式の質問をすることになると思います・・・ http://mevius.5ch.net/test/read.cgi/tech/1698705458/74
75: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-pD6R) [sage] 2023/12/11(月) 15:45:20.57 ID:wAhsIAfi0 >>72 もし C++20 を使えるなら (std::sort と違って) std::ranges::sort では比較関数とは別に 比較すべき要素を取り出す操作をプロジェクションとして与えることが出来るから これ一発でいけてだいぶん楽できる。 std::ranges::sort(bs, compA, &B::a); http://mevius.5ch.net/test/read.cgi/tech/1698705458/75
76: デフォルトの名無しさん (ワッチョイ d701-Qbcu) [sage] 2023/12/11(月) 16:01:10.52 ID:dil4ai7q0 >>75 すげ! 今そんなのあるんやね http://mevius.5ch.net/test/read.cgi/tech/1698705458/76
77: デフォルトの名無しさん (ワッチョイ d701-Qbcu) [sage] 2023/12/11(月) 16:34:20.59 ID:dil4ai7q0 >>74 思い出すのがしんどくなってきた #include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; struct A {int value_;}; bool compA2 (const A &lhs, const A &rhs) { return lhs.value_ < rhs.value_; } struct B {A a;}; int main () { vector <B> bs; bool (*compA) (const A &, const A &) {compA2}; sort (bs.begin(), bs.end(), bind (compA, bind (mem_fn (&B::a), placeholders::_1), bind (mem_fn (&B::a), placeholders::_2))); sort (bs.begin(), bs.end(), [compA] (const auto &lhs, const auto &rhs) {return (*compA) (lhs.a, rhs.a);}); return 0; } http://mevius.5ch.net/test/read.cgi/tech/1698705458/77
78: デフォルトの名無しさん (ワッチョイ 771f-oseA) [sage] 2023/12/11(月) 17:14:54.00 ID:cVrrslE50 >>75 >>77 お二方、ありがとうございます 参考にして組んでみます http://mevius.5ch.net/test/read.cgi/tech/1698705458/78
79: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-pD6R) [sage] 2023/12/11(月) 17:25:04.51 ID:wAhsIAfi0 その場で合成するのはさすがに見通しが悪すぎるので、 C++11 頃の C++ を仮定して私がやるならまずアダプタを作ると思う。 ちょっと雑ですまんがとりあえずこんな感じ。 class compB_adaptor { private: using comparator = std::function<bool(const A&, const A&)>; comparator compA; public: compB_adaptor(comparator comp) : compA(comp) {} bool operator()(const B& x, const B& y) { return compA(x.a, y.a); } }; 使うときには間にひとつ挟むだけで済む。 std::sort(bs.begin(), bs.end(), compB_adaptor(compA)); http://mevius.5ch.net/test/read.cgi/tech/1698705458/79
80: デフォルトの名無しさん (ワッチョイ 771f-oseA) [sage] 2023/12/11(月) 22:08:32.24 ID:cVrrslE50 >>79 求めていたものそのものであったため、採用させていただきました ありがとうございます http://mevius.5ch.net/test/read.cgi/tech/1698705458/80
81: デフォルトの名無しさん (ワッチョイ 1663-4if3) [sage] 2023/12/20(水) 23:47:12.14 ID:tqHuIeXr0 int x; std::cout << x; でxが正ののときは「+」符号を付けさせるのってどうするんでしたっけ…… cout.form("%+d", x)とか以外で http://mevius.5ch.net/test/read.cgi/tech/1698705458/81
82: デフォルトの名無しさん (ワッチョイ 2701-NGr8) [sage] 2023/12/20(水) 23:58:48.32 ID:Qfvbx0VO0 cout << showpos http://mevius.5ch.net/test/read.cgi/tech/1698705458/82
83: デフォルトの名無しさん (ワッチョイ 1663-4if3) [sage] 2023/12/21(木) 08:41:44.38 ID:6wjPSKlj0 てきました㌧クス、 iosヘッダで探せば良かったのか、、、 http://mevius.5ch.net/test/read.cgi/tech/1698705458/83
84: デフォルトの名無しさん (ワッチョイ 63d2-XEY5) [sage] 2023/12/21(木) 20:01:46.13 ID:i16TeC3D0 C++23だとこれ std::print("{:+}", x); http://mevius.5ch.net/test/read.cgi/tech/1698705458/84
85: デフォルトの名無しさん (ワッチョイ 4ba7-JRUi) [sage] 2023/12/22(金) 13:56:54.85 ID:pQLEje080 PythonやC#のようなf"{x}"構文が作られる事はないんだろうか http://mevius.5ch.net/test/read.cgi/tech/1698705458/85
86: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ d23e-E09z) [sage] 2023/12/22(金) 14:54:27.15 ID:gr/vrzoo0 >>85 リフレクションが充実すればその上に実装できるので 直接的な言語機能として用意すると 辻褄合わせが後で面倒になるだろうし、 現時点で考えるのは時期尚早だと思う。 http://mevius.5ch.net/test/read.cgi/tech/1698705458/86
87: デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/24(日) 17:42:14.24 ID:foDTiHm90 質問なのですが自作クラスFooのストリーム出力演算子に引数付きのマニピュレータを追加したいのですが ↓こんなやつ Foo obj; cout << custom_setw(10) << obj; // 整数のベクトル的なオブジェクトobjの要素を幅10文字で出力 custom_setw()で与えた10という数値をつつがなくFooのストリーム出力演算子 std::ostream& operator<<(std::ostream& os, const Foo& obj) に渡すには一体どうすれば……orz http://mevius.5ch.net/test/read.cgi/tech/1698705458/87
88: デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/24(日) 17:42:52.36 ID:foDTiHm90 グローバル変数渡しは最初に思いつくのですが、ostringstream os1, os2とFoo obj1, obj2に対して異なるスレッドで os1 << custom_setw(30) << obj1; // スレッド1 os2 << custom_setw(20) << obj2; // スレッド2 とかやったら詰むし std::setw()とか一体どうやってるんじゃ…… http://mevius.5ch.net/test/read.cgi/tech/1698705458/88
89: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-XnzH) [sage] 2023/12/24(日) 18:05:55.09 ID:SfA3xmSz0 >>87-88 特定の型を出力するときにだけ作用する書式を設定するマニピュレータってこと? std::setw がやってるのはストリームのメンバ関数 width を呼ぶのと同じ。 ストリームのオブジェクトが幅に関する情報を保存するデータメンバを持っていて、それを変更してる。 もちろんあなたが定義した独自の型 (この例では Foo) に結び付いた書式を保持するところなんて存在しないから単純にはできない。 私が思いつくのは ・ ストリームのほうも新しいものを定義する、つまり basic_ostream を継承して Foo 用の書式を格納するデータメンバを増やす ・ ストリームに対応付いたデータを格納するものを std::map かなんかで保持しておいて Foo を出力するときはそれを参照する ということくらいかな。 スレッドが絡むと面倒くさいけど、しょうがないね。 http://mevius.5ch.net/test/read.cgi/tech/1698705458/89
90: デフォルトの名無しさん (ワッチョイ 337c-dsFJ) [sage] 2023/12/24(日) 19:04:41.48 ID:vbUOIudY0 既存のcoutとかstringstreamとかで使いたいなら、グローバルのstd::unordered_map<std::ios_base*, MyManipData>にでも置いとくしかないだろうね ストリームオブジェクトの状態で持たせるクソ設計が悪いんだ http://mevius.5ch.net/test/read.cgi/tech/1698705458/90
91: デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/24(日) 19:34:37.93 ID:foDTiHm90 レス㌧クス、 >ストリームのオブジェクトが幅に関する情報を保存するデータメンバを持っていて、それを変更してる。 なるほど…… これはユザーの立場からはメンバの追加ができない領域なので、Fooの側にメンバを持たせることにしますか…… class FooWrp { const Foo& m_objRef; int m_nWidth; public: FooWrp(const Foo& obj, int width) : m_objRef(obj), m_nWidh(width) { } friend std::ostream& operator<<(std::ostream& os, const FooWrp& wrp) { ...(wrp.m_objRefの要素をwrp.m_nWidthに描かれている幅で出力する処理)... } }; http://mevius.5ch.net/test/read.cgi/tech/1698705458/91
92: デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/24(日) 19:35:17.01 ID:foDTiHm90 // 使い方 Foo obj; cout << FooWrp(obj, 10); ダッサwwwwwwwwwwwwwwwwwww しかし、「たかが表示の整形」のために排他制御しつつmapを弄ったりTLSの利用を考えるのもアレなのでこれはこれで仕方が無いのか、orz http://mevius.5ch.net/test/read.cgi/tech/1698705458/92
93: デフォルトの名無しさん (ワッチョイ a31e-H80b) [] 2023/12/24(日) 19:45:29.51 ID:Y8qSN/i/0 ストリーム用の演算子なんか作らずに オブジェクトの文字列表現を返す関数を用意したほうが汎用性高くない? http://mevius.5ch.net/test/read.cgi/tech/1698705458/93
94: デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/24(日) 19:50:06.00 ID:foDTiHm90 Foo obj; std::string s = obj.str(10); // 10億ギガ文字 cout << s; 出力を完遂できるんかこれ…… http://mevius.5ch.net/test/read.cgi/tech/1698705458/94
95: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-XnzH) [sage] 2023/12/24(日) 20:00:55.29 ID:SfA3xmSz0 C++20 からは std::formatter を特殊化して書式指定を解釈するコードを入れておけば std::format で独自の型を表示しようとしたときにその特殊化が使われる仕組みになってる。 http://mevius.5ch.net/test/read.cgi/tech/1698705458/95
96: デフォルトの名無しさん (ワッチョイ a31e-H80b) [] 2023/12/24(日) 21:41:50.00 ID:Y8qSN/i/0 オブジェクトの文字列表現が10億ギガ文字もあるの!? FooWrpオブジェクトをうっかりログに出力しちゃったら大変だね!! http://mevius.5ch.net/test/read.cgi/tech/1698705458/96
97: デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/29(金) 19:34:46.18 ID:MPSeCS+O0 実験せずに質問するますが、 int a, b; cin >> &x >> &y; に対し、 Q1. 「100 a」を入力したら例外もタイムアウト待ちも発生せず、cin.fail()がtrueになるだけ? Q2. 「100」とだけ入力してそのまんま(リダイレクト元のファイルハンドルか何かが タイムアウトもエラーもクローズもしなければ)ならそれっきり返ってこない? http://mevius.5ch.net/test/read.cgi/tech/1698705458/97
98: デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/29(金) 19:40:39.84 ID:MPSeCS+O0 EOFが抜けてたorz Q2のケースにおいて「100 [EOF]」なら(多分)cin.fail()でとりあえずすぐ返ってくるのかそうか、 http://mevius.5ch.net/test/read.cgi/tech/1698705458/98
99: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff3e-XnzH) [sage] 2023/12/29(金) 21:37:06.10 ID:0cvltfsQ0 >>97 実にしょうもない確認なんだけど、 言いたいことは int x, y; cin >> x >> y; でよいんだよね? http://mevius.5ch.net/test/read.cgi/tech/1698705458/99
100: デフォルトの名無しさん (ワッチョイ de63-J7+h) [sage] 2023/12/30(土) 05:42:41.89 ID:3ksfrMrT0 >>99 >int x, y; >cin >> x >> y; おk スマンカッタorz エラーとEOFのどちらかを検知したかったら!cin.good()が正しいっぽい? https://blog.emattsan.org/entry/20110819/1313743195 ここまでは分かった気がするが、 ストリーム入力演算子std::istream& operator>>(std::istream& os, Foo& obj)の中で入力に失敗した場合 どうやってエラーを呼び出し元に通知したらええんじゃ…… http://mevius.5ch.net/test/read.cgi/tech/1698705458/100
101: デフォルトの名無しさん (ワッチョイ de63-J7+h) [sage] 2023/12/30(土) 05:50:37.02 ID:3ksfrMrT0 クラスFooの入力ストリーム演算子の中で整数を2個読むとして、 std::istream& operator>>(std::istream& os, Foo& obj) { int x, y; os >> x >> y; if (!os.goot()) { return os; // エラー発生時は単純にreturn os; でおk? } obj.m_x = x; obj.m_y = y; return os; } http://mevius.5ch.net/test/read.cgi/tech/1698705458/101
102: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 43c3-KM86) [sage] 2023/12/30(土) 08:47:16.28 ID:XV37Te4m0 >>100 ストリームのフラグを立てるメンバ関数は setstate だけど >>101 の状況ならフラグはもう立ってるから戻るだけで問題ないよ。 http://mevius.5ch.net/test/read.cgi/tech/1698705458/102
103: デフォルトの名無しさん (ワッチョイ de63-J7+h) [sage] 2023/12/30(土) 13:48:41.88 ID:3ksfrMrT0 わかりた ていうかエラー判定(eofbit以外のビットのセットを判定)なら!os.good()や!os.goot()ではなくて os.failed()か!osですたね……orz これらに関して追加の質問が出たら初心者スレに書くわサーセン;;; http://mevius.5ch.net/test/read.cgi/tech/1698705458/103
104: デフォルトの名無しさん (ワッチョイ e95f-pFp4) [sage] 2023/12/31(日) 20:09:05.68 ID:tpduSr4A0 class A{ char buf_[size]; } このbuf_に任意のオブジェクトをplacement newして使用するのだけど このオブジェクトをコピーしたりムーブする場合、単純にコピー元のbuf_からコピー先のbuf_にmemcopyしてしまって大丈夫ですか? http://mevius.5ch.net/test/read.cgi/tech/1698705458/104
105: デフォルトの名無しさん (ワッチョイ 06a2-M+UX) [sage] 2023/12/31(日) 20:44:02.18 ID:bvEcnWMM0 全く大丈夫じゃない 初心者スレからどうぞ http://mevius.5ch.net/test/read.cgi/tech/1698705458/105
106: デフォルトの名無しさん (ワッチョイ 8101-KEYj) [sage] 2023/12/31(日) 20:54:11.90 ID:NNsdlVTY0 構造体から派生させれば出来るよ http://mevius.5ch.net/test/read.cgi/tech/1698705458/106
107: デフォルトの名無しさん (ワッチョイ 06a2-M+UX) [sage] 2023/12/31(日) 21:04:16.47 ID:bvEcnWMM0 せめてPODと言おう 初心者スレからどうぞ http://mevius.5ch.net/test/read.cgi/tech/1698705458/107
108: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0904-OTTg) [sage] 2024/01/01(月) 00:18:02.48 ID:6hyMwo3D0 POD は削除された。 trivially copyable の要件を満たすならその型は memcpy でコピーしてもよい。 std::is_trivially_copyable で判定できるのでどこかに制約を入れておけば安心かもね。 http://mevius.5ch.net/test/read.cgi/tech/1698705458/108
109: デフォルトの名無しさん (ワッチョイ 656a-R/a6) [sage] 2024/01/01(月) 00:36:03.09 ID:an53Mx2V0 削除されたんですか?(バージョンいくつで?) c++20 で非推奨になった、てのはすぐ調べられたんだけどその先が分からんです http://mevius.5ch.net/test/read.cgi/tech/1698705458/109
110: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0904-OTTg) [sage] 2024/01/01(月) 00:46:07.42 ID:6hyMwo3D0 >>109 規格の文面としては C++20 で POD はもう削除されていて POD の概念を使わない形で再編されてる。 std::is_pod はまだある (非推奨) からこれが POD の定義だという意味ではまだあるとも言えるけど。 http://mevius.5ch.net/test/read.cgi/tech/1698705458/110
111: デフォルトの名無しさん (ワッチョイ 06a2-M+UX) [sage] 2024/01/01(月) 00:46:34.65 ID:l/ylj5kb0 アライメント忘れてるぞ http://mevius.5ch.net/test/read.cgi/tech/1698705458/111
112: デフォルトの名無しさん (ワッチョイ e1f0-JZT3) [sage] 2024/01/01(月) 03:01:35.02 ID:5pNbZa2B0 >>104 まず自分でコード書いてみ よろしくないところは指摘してやるから http://mevius.5ch.net/test/read.cgi/tech/1698705458/112
113: デフォルトの名無しさん (ワッチョイ 8101-KEYj) [sage] 2024/01/01(月) 03:14:22.37 ID:8zoq4UeO0 オワコン名称出してマウント。プークスクス http://mevius.5ch.net/test/read.cgi/tech/1698705458/113
114: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg) [sage] 2024/01/01(月) 03:40:47.98 ID:hmX3WjmM0 POD が削除されたかどうかは重要ではなくて、 POD より弱い制約 (trivially copyable) で memcpy が許されるというのが主旨。 その点は C++11 からそうなってる。 http://mevius.5ch.net/test/read.cgi/tech/1698705458/114
115: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg) [sage] 2024/01/01(月) 04:06:49.46 ID:hmX3WjmM0 「構造体」ってのも C++ 用語的にはイケてないと思うよ。 http://mevius.5ch.net/test/read.cgi/tech/1698705458/115
116: デフォルトの名無しさん (ワッチョイ d24b-WshQ) [] 2024/01/01(月) 04:55:26.71 ID:e5pnn2Xx0 アライメントは基本型のどれかと同じアライメント制約に合わせれば良いいということなら 使おうとしているうちで最も厳しいアライメント制約に一致する基本型を含むunionで解決するというのがC言語における伝統的な手法という印象、 C++でunionにしたら(それが可能なメンバのみなら) memcpyは安全とかにはならない? http://mevius.5ch.net/test/read.cgi/tech/1698705458/116
117: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg) [sage] 2024/01/01(月) 05:30:52.12 ID:hmX3WjmM0 >>116 コンストラクタや代入演算子がトリビアルであることなどの制約を守れば共用体も trivially copyable になりうる。 (C++ の共用体はコンストラクタやメンバ関数を定義できるがそこらが制限されることになる。) http://mevius.5ch.net/test/read.cgi/tech/1698705458/117
118: デフォルトの名無しさん (ワッチョイ 65e8-QK8A) [] 2024/01/01(月) 14:24:55.17 ID:kge3DGj60 char* と long* のコピーは? http://mevius.5ch.net/test/read.cgi/tech/1698705458/118
119: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-slPv) [sage] 2024/01/01(月) 15:31:30.97 ID:hmX3WjmM0 ポインタも含めてスカラ型は Trivially copyable https://timsong-cpp.github.io/cppwp/n4861/basic.types#9 http://mevius.5ch.net/test/read.cgi/tech/1698705458/119
120: デフォルトの名無しさん (ワッチョイ e95f-pFp4) [sage] 2024/01/03(水) 23:34:38.84 ID:w4EAqTeZ0 >>112 とりあえず書いてみたけどどうですかね? template<std::size_t buf_size> struct A { private: struct base_ { virtual ~base_() {}; }; template <typename F> struct derived_ : base_ { F f_; derived_(F f) : f_{ std::move(f) } {} }; base_* p_; alignas(alignof(std::max_align_t)) uint8_t buf[buf_size]={0}; public: A() :p_(nullptr) {}; template <typename F> void assign(F f) { if (p_ == nullptr) { p_ = ::new (buf) derived_<F>{std::move(f)}; } } //コピーコンストラクタ A(A& src) { p_ = ::new (buf) decltype(src.*p_); //ここが怪しい }; }; http://mevius.5ch.net/test/read.cgi/tech/1698705458/120
121: デフォルトの名無しさん (ワッチョイ 9901-r6/T) [sage] 2024/01/04(木) 00:44:07.87 ID:/FDyuY0i0 decltype(src.*p_)ってbase_なのでダメだろう http://mevius.5ch.net/test/read.cgi/tech/1698705458/121
122: デフォルトの名無しさん (ワッチョイ e1f0-JZT3) [sage] 2024/01/04(木) 00:58:18.81 ID:ECF9R1Fj0 ていうか、decltypeで型指定してるだけだからコピーもなにもされてないぞソレ http://mevius.5ch.net/test/read.cgi/tech/1698705458/122
123: デフォルトの名無しさん (ワッチョイ 0644-M+UX) [sage] 2024/01/04(木) 02:28:40.49 ID:oZapr/U70 std::anyのコードでも読んだほうが早い http://mevius.5ch.net/test/read.cgi/tech/1698705458/123
124: デフォルトの名無しさん (ワッチョイ 9901-r6/T) [sage] 2024/01/04(木) 09:11:56.12 ID:/FDyuY0i0 A::base_に以下を足してA::derived_で実装し Aのコピーコンストラクタから呼べば? virtual base_ *clone (void *p) = 0; http://mevius.5ch.net/test/read.cgi/tech/1698705458/124
125: デフォルトの名無しさん (ワッチョイ 6564-QK8A) [] 2024/01/04(木) 13:26:37.40 ID:1KQpMTCj0 void*って、ポインターの先のサイズ未知だよなぁ http://mevius.5ch.net/test/read.cgi/tech/1698705458/125
126: デフォルトの名無しさん (ワッチョイ e95f-pFp4) [sage] 2024/01/04(木) 17:16:40.43 ID:ACseOt7T0 derived_かそのメンバf_の型を知るにはRTTIしかないのですかね? >>121 decltypeだと派生先の型はわからないのか >>122 実体のコピーの処理が抜けてました… http://mevius.5ch.net/test/read.cgi/tech/1698705458/126
127: デフォルトの名無しさん (ワッチョイ e95f-pFp4) [sage] 2024/01/04(木) 21:53:05.60 ID:ACseOt7T0 >>124 こんな感じです? struct base_ { virtual base_* clone (void *p) = 0; virtual ~base_() {}; }; template <typename F> struct derived_ : base_ { F f_; derived_(F f) : f_{ std::move(f) } {} base_* clone (void *p_buf){ return new(reinterpret_cast<derived_<F>*>(p_buf))(f_); } }; A(A& src) { p_ = src.clone((void*)buf); }; http://mevius.5ch.net/test/read.cgi/tech/1698705458/127
128: デフォルトの名無しさん (ワッチョイ e1f0-JZT3) [sage] 2024/01/04(木) 22:19:16.70 ID:ECF9R1Fj0 derived_(F f) ←この時点でムダなコピーが1度発生していることには気付いてる? http://mevius.5ch.net/test/read.cgi/tech/1698705458/128
129: デフォルトの名無しさん (ワッチョイ 9901-r6/T) [sage] 2024/01/04(木) 22:21:15.81 ID:/FDyuY0i0 >>127 書き込む前にコンパイルしなよ http://mevius.5ch.net/test/read.cgi/tech/1698705458/129
130: デフォルトの名無しさん (ワッチョイ 651a-R/a6) [sage] 2024/01/04(木) 22:41:26.61 ID:Dv09vJ7A0 バッファの中にオブジェクトを作れたら、それで何をしたいのかが気になる http://mevius.5ch.net/test/read.cgi/tech/1698705458/130
131: デフォルトの名無しさん (ワッチョイ 0644-M+UX) [sage] 2024/01/04(木) 23:21:36.86 ID:oZapr/U70 >>127 cloneの中ってplacement newでcopy constructorを呼ぼうとしてるんだよな? いちおうあってるけどundefined behaviorまみれ http://mevius.5ch.net/test/read.cgi/tech/1698705458/131
132: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg) [sage] 2024/01/04(木) 23:35:27.70 ID:td6kYpbC0 たぶんやりたいことは std::allocator_traits::construct なのかな http://mevius.5ch.net/test/read.cgi/tech/1698705458/132
133: デフォルトの名無しさん (ワッチョイ 7f7c-JApz) [] 2024/01/11(木) 04:45:44.72 ID:wlSOhq+Y0 例外って全部mainで捕捉すべきかな? 調べてみたら例外が捕捉されずにプログラムが終了する場合スタックアンワインドが起こるかは実装定義みたいなんだけど、それじゃグローバルなオブジェクトのデストラクタが呼ばれないんじゃないかって思って試してみたのよ。 https://ideone.com/wSLZfL やっぱりデストラクタは呼ばれなかったからリソースリークが起こりうるんじゃないかと思うんだけど、例外に対してはどういう態度でいるべきかな? A. リソースリークはまずい。だから例外は全部捕捉するべき。 B. 例外はロジック上捕捉する必要があるものだけ捕捉して、それ以外はほっといていい。 C. 例外が捕捉されなければstd::abortが呼ばれるので、コアダンプなりで色々調べることもできる。だからmainで例外を全部握りつぶすようなことはすべきではない。 D. 時と場合による。 例外時の挙動とか仕様とか調べてるうちに頭ぐるぐるしてわけわかんなくなってきた http://mevius.5ch.net/test/read.cgi/tech/1698705458/133
134: デフォルトの名無しさん (ワッチョイ dff7-1VUN) [] 2024/01/11(木) 08:40:16.50 ID:8oRrkiTZ0 そもそもプログラムが終了してリソースリークするのかな? メモリー、ファイルハンドル、ソケット、ミューテックスなどのリソースはOSが責任持って解放するよね どのようなリソースがリークしますか? http://mevius.5ch.net/test/read.cgi/tech/1698705458/134
135: デフォルトの名無しさん (ワッチョイ 7f01-2R+Q) [sage] 2024/01/11(木) 08:45:02.51 ID:ETJgFBFV0 すべてじゃね? http://mevius.5ch.net/test/read.cgi/tech/1698705458/135
136: デフォルトの名無しさん (ワッチョイ 7f01-2R+Q) [sage] 2024/01/11(木) 08:46:53.81 ID:ETJgFBFV0 >>133 すべてじゃね? それらの選択肢は別に排他的な選択肢じゃないかと http://mevius.5ch.net/test/read.cgi/tech/1698705458/136
137: デフォルトの名無しさん (ワッチョイ 7f3a-NF1f) [] 2024/01/11(木) 09:02:22.25 ID:dA95iQ6m0 OS管理なリソースはアプリの終了なんか知らないってのもあるからなぁ 得にドライバ関連とかな http://mevius.5ch.net/test/read.cgi/tech/1698705458/137
138: デフォルトの名無しさん (ワッチョイ dfab-acFs) [sage] 2024/01/11(木) 15:30:41.76 ID:hAXa3uBd0 >>136 あれ、少なくともAとCは排他的だと思うんだけど 全部の選択肢を選ぶとすると具体的にはどうなるのかな http://mevius.5ch.net/test/read.cgi/tech/1698705458/138
139: デフォルトの名無しさん (ワッチョイ ff11-Nf4k) [sage] 2024/01/11(木) 20:09:25.46 ID:AWAYnmwT0 今どきのOS使ってたらOSリソースはリークしない まぁプロセスがゾンビになるのはよくあるが http://mevius.5ch.net/test/read.cgi/tech/1698705458/139
140: デフォルトの名無しさん (ワッチョイ ff11-Nf4k) [sage] 2024/01/11(木) 20:09:51.72 ID:AWAYnmwT0 >>137 しったかすんな http://mevius.5ch.net/test/read.cgi/tech/1698705458/140
141: デフォルトの名無しさん (ワントンキン MMdf-7Pe6) [sage] 2024/01/11(木) 20:12:29.21 ID:h5T3Zf1WM そもそもアプリ的にデータの不整合とか出るから論外だろう ファイルやなんかの外部データ使わないなら関係ないだろうけど http://mevius.5ch.net/test/read.cgi/tech/1698705458/141
142: デフォルトの名無しさん (ワッチョイ ff11-Nf4k) [sage] 2024/01/11(木) 20:12:30.15 ID:AWAYnmwT0 よくあるのは異常終了時にファイルをフラッシュしておきたいとかだろ 汎用的にこれを実現するのは結構むずい http://mevius.5ch.net/test/read.cgi/tech/1698705458/142
143: デフォルトの名無しさん (ワッチョイ ff11-Nf4k) [sage] 2024/01/11(木) 20:14:10.04 ID:AWAYnmwT0 あとコアダンプの観点では例外飛ばさずに即死したほうがいい http://mevius.5ch.net/test/read.cgi/tech/1698705458/143
144: デフォルトの名無しさん (ワッチョイ df5a-XokC) [sage] 2024/01/11(木) 21:36:53.22 ID:40hQdtQK0 エラーだからって一時ファイル山盛り残して放置しないでください http://mevius.5ch.net/test/read.cgi/tech/1698705458/144
145: デフォルトの名無しさん (ワッチョイ 7f7c-acFs) [sage] 2024/01/11(木) 22:44:37.94 ID:wlSOhq+Y0 質問した者だけど 確かに近代的なOSであればリソースの始末はよしなにやってくれるだろうし、「絶対にデストラクタが呼ばれなきゃ困る」って状況でもなければいちいちすべての例外を捕捉する必要はないのかな(毎回ボイラープレートコードみたいに書くのもやだし) http://mevius.5ch.net/test/read.cgi/tech/1698705458/145
146: デフォルトの名無しさん (スッップ Sd9f-d+nK) [sage] 2024/01/12(金) 01:18:38.26 ID:P05ikaaEd 例外処理って、メモリ破壊やファイルシステム破壊みたいな絶望的な状況を想定しなきゃいけないんだよ。 ファイルに何か書き込んだら他のファイルを壊しちゃうかもしれない、みたいな。 だからファイル関連の操作をしていいのは、ファイルシステム周りの無事を確信できるときだけ。 データを上書き保存とかしていいのは、データとファイルシステム両方の無事を確信できるときだけ。 何も確信できないときは、何もせずに墜ちなきゃいけない。 ってことで例外機構はデフォルトで何もせずに異常終了するようになってるんだよ。 http://mevius.5ch.net/test/read.cgi/tech/1698705458/146
147: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-Cx9t) [sage] 2024/01/12(金) 02:09:19.72 ID:Z8/dVhwe0 理想的には全ての例外はキャッチされるべき。 ただ、現実は理想的ではない。 キャッチするのは対処するためなので想定漏れで思ってもなかったような例外が上がってきた (対処が出来てない) ならそれはバグなんだから検証して修正する必要があるわけだし、検証しやすい形で止まったほうがいい。 C++ ではスタックの巻き戻しの途中で例外を送出したときの挙動は未定義なので通例ではデストラクタから例外を投げないように設計される。 つまりデストラクタでの後始末に失敗したらもうそれを (例外機構の仕組みでは) フォローできない。 想定されてない例外が上がってるときに後始末がちゃんとできずにわけのわからない動作を引き起こしたら検証にも支障がある。 http://mevius.5ch.net/test/read.cgi/tech/1698705458/147
148: デフォルトの名無しさん (ワッチョイ 7f7c-acFs) [sage] 2024/01/12(金) 09:48:31.22 ID:1nCpSyqU0 じゃあ「投げられうるすべての例外に適切な対処ができるのが理想的だが、対処しきれない例外は投げられっぱなしにする(そしてプログラムを即座に異常終了させる)方が、思考停止でとりあえず捕捉しておくよりはまだマシ」ってことになるのかな みんなありがとう http://mevius.5ch.net/test/read.cgi/tech/1698705458/148
149: デフォルトの名無しさん (ワントンキン MMdf-7Pe6) [sage] 2024/01/12(金) 09:51:15.81 ID:Vmsz+UsIM いやいや、ちゃんとデバッグしろよ こんなやつとは絶対一緒に仕事したくない http://mevius.5ch.net/test/read.cgi/tech/1698705458/149
150: デフォルトの名無しさん (ワッチョイ 5f4e-1VUN) [] 2024/01/12(金) 09:58:11.40 ID:yLdIK4jH0 ライブラリ書くときはライブラリで対処できない例外は握り潰さずに上位で伝搬させろ!と言われてるよね アプリも同じだと思う 明確に対処すべきことがあるなら例外をキャッチすればいいし ないならそのままプロセス落としてOSに任せればいいんでない? http://mevius.5ch.net/test/read.cgi/tech/1698705458/150
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 852 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.030s