[過去ログ]
C++相談室 part164 (1002レス)
C++相談室 part164 http://mevius.5ch.net/test/read.cgi/tech/1683600652/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
210: デフォルトの名無しさん (ワッチョイ 13f0-8sUu) [sage] 2023/06/15(木) 18:41:07.51 ID:QIwD56Ju0 最近IPP触り始めたんですが全部飽和演算で面食らってます Modulo関数は無いんですか? http://mevius.5ch.net/test/read.cgi/tech/1683600652/210
211: デフォルトの名無しさん (ワッチョイ fb8c-jufV) [sage] 2023/06/15(木) 21:00:11.51 ID:W1C5TI4i0 >>207 ああ、ごめん。めっちゃデカイインスタンスのvectorじゃなくて、めっちゃデカイvectorね。 それなら実装依存だけど>184か、>192とか参照無効化の制限とかコピーコストとかあるけど>189。189はsmart ptrにしとけば実用上問題ないかね。vectorのイテレーターは保存するものじゃないし。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/211
212: デフォルトの名無しさん (ワッチョイ c14e-8sUu) [sage] 2023/06/15(木) 21:28:08.23 ID:3cvhbwG+0 実際の所、vectorならclear()→shrink_to_fit()でメモリが開放されないこってありうるの? http://mevius.5ch.net/test/read.cgi/tech/1683600652/212
213: デフォルトの名無しさん (ワッチョイ d17c-sLM4) [sage] 2023/06/15(木) 22:10:40.95 ID:usfnoco+0 規格上はshrink_to_fit()にメモリ解放する義務はないし、実装定義で何やっても自由(capacityを増やすような真似だけは禁止) shrink_to_fit()がなんにもしない実装でも一応規格準拠になる そんな糞みたいな実装が実在するかは知らない http://mevius.5ch.net/test/read.cgi/tech/1683600652/213
214: デフォルトの名無しさん (US 0H0b-q0yD) [sage] 2023/06/16(金) 02:13:28.00 ID:PZdB0bgSH >>211 はい結局一人だけ違う話してた ハァァ~~~~~(クソデカため息) http://mevius.5ch.net/test/read.cgi/tech/1683600652/214
215: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ c13e-2rqm) [sage] 2023/06/16(金) 11:31:25.61 ID:QEmhRLek0 >>212 基本的には効率的に実装されるものだと信じて良いと思うが どういう実装が効率的であるかは実行環境の事情による。 たとえばメモリ管理がページ単位というのは普通のことだし その場合にページ単位より細かく確保したり解放したりしても非効率になる。 常に何もしないというような実装はあまりないと思うけど 解放するほうが非効率だと考えられる状況では shrink_to_fit を呼んでも解放しなかったり部分的にだけ解放する というこ
とはそれなりにあり得そうだと思うよ。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/215
216: デフォルトの名無しさん (ワッチョイ 01c9-6bUV) [sage] 2023/06/16(金) 12:08:14.46 ID:nWXjt7Za0 capacityと OS側からみた空きメモリはまた別かもしれんわけで アロケーターがOSからじかに要求してる場合もあれば OSへの要求回数を減らして内部でプールしてやりくりしてるのもあるし 制御したいレイヤーによっては全部自前でやるしかない という落ちにも http://mevius.5ch.net/test/read.cgi/tech/1683600652/216
217: デフォルトの名無しさん (ワッチョイ c14e-8sUu) [sage] 2023/06/16(金) 12:26:43.83 ID:B2wRJ7jC0 >>215 まぁ、細かい単位のメモリだったら、実際に開放されているかどうかなんて、ほとんど動作に影響しないとも言えるしね (未初期化変数の不具合が発覚しづらい、くらいか) とりあえずshrink_to_fitを呼んでおいて、細かいことは気にしないのが一番かもしれないw http://mevius.5ch.net/test/read.cgi/tech/1683600652/217
218: デフォルトの名無しさん (ワッチョイ 934f-q0yD) [sage] 2023/06/16(金) 12:46:08.57 ID:H6XPX5qB0 「STLコンテナ以外にも」という文言が読めてない文盲さんたちがvectorの話ばっかしててワロ http://mevius.5ch.net/test/read.cgi/tech/1683600652/218
219: デフォルトの名無しさん (ワッチョイ d969-2rqm) [sage] 2023/06/16(金) 15:41:25.79 ID:KX+TErXo0 「STLコンテナ以外にも」はSTLコンテナも含むということ STLコンテナの話をしても何もおかしくない http://mevius.5ch.net/test/read.cgi/tech/1683600652/219
220: デフォルトの名無しさん (アウアウウー Sadd-g1CP) [sage] 2023/06/16(金) 15:43:23.81 ID:ly+Q1cW8a いつものことだが ほんの最初の数レスで終わってるのに どうでも良い脱線ほど盛り上がってgdgdレスでスレが延びる http://mevius.5ch.net/test/read.cgi/tech/1683600652/220
221: デフォルトの名無しさん (アウアウウー Sadd-Xx8j) [sage] 2023/06/16(金) 15:46:42.75 ID:/DJegtL/a ほんそれ 回答終了してんのにちんこかゆい http://mevius.5ch.net/test/read.cgi/tech/1683600652/221
222: デフォルトの名無しさん (スフッ Sd33-pDI4) [] 2023/06/16(金) 15:49:19.69 ID:YNpYq5+wd >>182 良く読むと >STL コンテナ以外にも、大きいメモリが割り当てられてるオブジェクトを使用後に破棄したいというケースがよくあります。 >最も簡単なやり方は関数とか局所的なスコープとして切り出すことかと思いますが いやいやそもそも「関数とか局所的なスコープ(つまりautoだろ?stackだろ?)で大きいメモリ確保しようなんて思うな」って話なんだよな http://mevius.5ch.net/test/read.cgi/tech/1683600652/222
223: デフォルトの名無しさん (ワッチョイ e95f-2rqm) [sage] 2023/06/16(金) 16:09:01.10 ID:qgM8i0iT0 ローカルなvectorを置けばヒープ確保されるので「つまりautoだろ?stackだろ?」は また何か誤解してる人が来たなとしか。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/223
224: デフォルトの名無しさん (ワッチョイ 219b-q0yD) [sage] 2023/06/16(金) 16:49:22.15 ID:ybGonaVE0 reset要らないとか言ってる奴らは結局何なん http://mevius.5ch.net/test/read.cgi/tech/1683600652/224
225: デフォルトの名無しさん (テテンテンテン MMeb-jufV) [sage] 2023/06/16(金) 19:32:47.80 ID:yx9ngvFiM >>224 結論は>211にまとめといた。 resetは要らん。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/225
226: デフォルトの名無しさん (ワッチョイ 92dc-gfWY) [sage] 2023/06/17(土) 08:56:51.34 ID:3MnK6eEg0 >>223 「STLコンテナ以外にも」という文言が読めてない文盲さんたちがvectorの話ばっかしててωωω http://mevius.5ch.net/test/read.cgi/tech/1683600652/226
227: デフォルトの名無しさん (テテンテンテン MM96-Axrn) [sage] 2023/06/17(土) 10:36:04.78 ID:koF9X0k9M >>226 「大きいメモリが割り当てられてるオブジェクトを使用後に破棄したい」なら >185か>187。 >187はunique ptrの置き場所と解放タイミングによって解放の仕方が違って、自動変数にして関数やスコープから抜けるタイミングで解放するなら手動操作不要、vectorなどのヒープに置くとかスコープの終わり前に解放したいとかならreset()とかvectorの要素削除とかで手動解放。 いずれにしても、自動変数に巨大インスタンスを考え無しに
置くのは悪手で、そのオブジェクトがスタックに巨大データを置かない(ヒープ等に置く)ことを確認してからにしたほうがいい。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/227
228: デフォルトの名無しさん (ワッチョイ 6128-l8k0) [sage] 2023/06/17(土) 15:30:36.02 ID:S+64vkUJ0 >>216 vectorのcapacityはそのvectorが氏ぬかcapacity縮小アクションが生じない限りvector固有に占有されるから capacity(のうちsize()を超える分)と OS側からみた空きメモリはまた別でケテーイ…… 一方malloc()がOSからゲットしたメモリをOSに返さずにいるのはOS側からみた空きメモリではないにしろ 同一プロセス内の他のオブジェクトの構築に使えるのだから空きメモリのうち これすらもOSに返したいということならこの流れの中で現状答えがでて
いないキモヌ http://mevius.5ch.net/test/read.cgi/tech/1683600652/228
229: デフォルトの名無しさん (ワッチョイ 6128-l8k0) [sage] 2023/06/17(土) 15:31:34.82 ID:S+64vkUJ0 まあしいて言えばプロセスを一旦exitして再立ち上げ? http://mevius.5ch.net/test/read.cgi/tech/1683600652/229
230: デフォルトの名無しさん (ワッチョイ 6128-l8k0) [sage] 2023/06/17(土) 15:45:09.56 ID:S+64vkUJ0 普通に作ったら(コードで明示的に直接OSのAPIでメモリを分捕って解放とかしない限りは プロセスのprivate bytesはプロセスが氏ぬまで増えることはあっても減ることは無いという印象、 http://mevius.5ch.net/test/read.cgi/tech/1683600652/230
231: デフォルトの名無しさん (ワッチョイ 7d9b-trtU) [sage] 2023/06/17(土) 16:27:35.20 ID:5e+acAEX0 >>225 スマンまじで理解できないのだけど、なぜvectorに限った話をしてるの? http://mevius.5ch.net/test/read.cgi/tech/1683600652/231
232: デフォルトの名無しさん (テテンテンテン MM96-Axrn) [sage] 2023/06/17(土) 19:22:00.09 ID:mYwWSuEFM >>231 巨大インスタンスは>227 http://mevius.5ch.net/test/read.cgi/tech/1683600652/232
233: デフォルトの名無しさん (ワッチョイ d9ab-trtU) [sage] 2023/06/17(土) 19:29:36.10 ID:HtrmHz3i0 回答者のレベル低いな~~~ こんだけダラダラ続けて、結局質問者>>182が>>190で早々に結論づけてることをリピートしてるだけw http://mevius.5ch.net/test/read.cgi/tech/1683600652/233
234: デフォルトの名無しさん (ワッチョイ 69f0-J7ro) [sage] 2023/06/17(土) 19:54:50.95 ID:9hSxsWrs0 アロケータ気に入らないなら自作くらいしろよポンコツ なにもかもSTLに頼りやがってそれでPGやってるつもりになるなよ http://mevius.5ch.net/test/read.cgi/tech/1683600652/234
235: デフォルトの名無しさん (ワッチョイ 6128-l8k0) [sage] 2023/06/17(土) 20:19:47.36 ID:S+64vkUJ0 人類には早すぎた話題また…… http://mevius.5ch.net/test/read.cgi/tech/1683600652/235
236: デフォルトの名無しさん (オイコラミネオ MM91-L1I+) [sage] 2023/06/17(土) 23:14:07.63 ID:H9lc23A5M 次世代の人は便利に使いこなしてるかより簡素になった仕組みを使うのだろう http://mevius.5ch.net/test/read.cgi/tech/1683600652/236
237: デフォルトの名無しさん (ワッチョイ 655f-rdTE) [sage] 2023/06/18(日) 03:00:55.26 ID:GIMFAM+a0 >>231 コンテナの種類を問わない一般的な方法なんてものはないからじゃないですかね http://mevius.5ch.net/test/read.cgi/tech/1683600652/237
238: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/18(日) 21:04:45.70 ID:VwYqKwPk0 以下のコードでaccumulateのとこでコンパイルエラーが起こります 何故か分かります? #include <iostream> #include <array> #include <deque> #include <exception> #include <numeric> using Vector = std::array <double, 3>; using Vector_Container = std::deque <Vector>; Vector &operator += (Vector &lhs, const Vector &rhs) { const auto size {lhs.size ()}; if (size != rhs.size ()) throw s
td::runtime_error ("Sizes are different."); for (size_t i {0}; i < size; ++ i) lhs [i] += rhs [i]; return lhs; } Vector operator + (const Vector &lhs, const Vector &rhs) { Vector result {lhs}; result += rhs; return result; } int main () { Vector v0 {0, 1, 2}, v1 {10, 11, 12}; Vector_Container c0 {v0, v1}; accumulate (c0.begin (), c0.end (), Vector {}); // コンパイルエラー return 0; } http://mevius.5ch.net/test/read.cgi/tech/1683600652/238
239: デフォルトの名無しさん (ワッチョイ 515f-C6j3) [sage] 2023/06/18(日) 21:45:44.90 ID:UCXMUPHB0 >>238 エラーメッセージ見ればたぶん分かる。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/239
240: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/18(日) 21:48:16.43 ID:VwYqKwPk0 >>239 レス有難うございます まず訂正 -accumulate +std::accumulate 全部は貼れないですけど大事そうなところ In file included from /usr/include/c++/12/numeric:62, from test1.cpp:18: /usr/include/c++/12/bits/stl_numeric.h: In instantiation of ‘constexpr _Tp std::accumulate(_InputIterator, _InputIterator, _Tp) [with _InputIterator = _Deque_iterator<array<double, 3>, array<double, 3>&, array<doubl
e, 3>*>; _Tp = array<double, 3>]’: test1.cpp:22:14: required from here /usr/include/c++/12/bits/stl_numeric.h:141:46: error: no match for ‘operator+’ (operand types are ‘std::remove_reference<std::array<double, 3>&>::type’ {aka ‘std::array<double, 3>’} and ‘std::array<double, 3>’) 141 | __init = _GLIBCXX_MOVE_IF_20(__init) + *__first; http://mevius.5ch.net/test/read.cgi/tech/1683600652/240
241: デフォルトの名無しさん (ワッチョイ 9e81-L1I+) [sage] 2023/06/18(日) 23:15:51.41 ID:w3/xAOT+0 ADLでoperator+が見つからないからかな? struct Vector : std::array <double, 3> {}; みたいに定義したらいけるのでは http://mevius.5ch.net/test/read.cgi/tech/1683600652/241
242: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/18(日) 23:20:13.62 ID:VwYqKwPk0 >>241 >struct Vector : std::array <double, 3> {}; >みたいに定義したらいけるのでは 通りますね どういうこと? http://mevius.5ch.net/test/read.cgi/tech/1683600652/242
243: デフォルトの名無しさん (ワッチョイ 32fb-9xvA) [] 2023/06/18(日) 23:24:52.33 ID:bX3uBTIT0 std::accumulateが14行目で定義したoperator+を見つけれてないのが原因っぽい。 std::accumulateの第4引数に [](const Vector& v1, const Vector& v2){ return v1+v2;} を追加してやるとコンパイルは通る。 14行目のoperator+をstd名前空間に入れてやれば動くにゃ動くけど色々マズいので(調査する分にはいいけど)最終的な解答にはならないかな http://mevius.5ch.net/test/read.cgi/tech/1683600652/243
244: デフォルトの名無しさん (ワッチョイ 32fb-9xvA) [] 2023/06/18(日) 23:29:04.68 ID:bX3uBTIT0 >>242 たぶんC++コンパイラはoperator+の候補を検索するときに Vector( = std::array<double, 3>)と同じ名前空間にあるものしか検索しない Vectorのクラス定義そのものがグローバル名前空間にあるなら14行目のoperator+を見つけられるけど、 今はVectorの正体はstd::array<...>なのでstd名前空間しか検索しないんだと思う http://mevius.5ch.net/test/read.cgi/tech/1683600652/244
245: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/18(日) 23:39:19.50 ID:VwYqKwPk0 >>243,244 なるほど解説頂きまして有難うございます グローバルスコープはどっからでも見えて良さそうなものの 何でグローバルスコープの関数を探さないですかね? http://mevius.5ch.net/test/read.cgi/tech/1683600652/245
246: デフォルトの名無しさん (ワッチョイ a901-UvLK) [] 2023/06/18(日) 23:48:03.44 ID:EGGkT3O00 独自のメンバ変数を持たないのなら継承してしまうのも手ではある(ただしコンストラクタやarrayを受け取るキャスト用コンストラクタとか書く必要が出ると思うけど) ただ、そもそもカスタマイズしたり自分の用途に本当に使いやすいものを作りたいなら、ちゃんと自分で全部書いた方がいいと思うよ http://mevius.5ch.net/test/read.cgi/tech/1683600652/246
247: デフォルトの名無しさん (ワッチョイ b110-lSMs) [sage] 2023/06/19(月) 00:42:02.49 ID:2lgIrH6A0 >>245 std::accumlateの定義内からだと、その下の方(ユーザーコード)で定義されてるoperator+は見えてないので、グローバル名前空間の探索では見つからない http://mevius.5ch.net/test/read.cgi/tech/1683600652/247
248: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/19(月) 00:52:39.28 ID:Q4g6N6uX0 >>247 std::accumlateが定義されているnumericをincludeする前に 以下のようにグローバルスコープにプロトタイプを置いても 同じようにoperator+が見えてないとエラーが出ます using Vector = std::array <double, 3>; Vector operator + (const Vector &lhs, const Vector &rhs); #include <numeric> http://mevius.5ch.net/test/read.cgi/tech/1683600652/248
249: デフォルトの名無しさん (ワッチョイ a901-UvLK) [] 2023/06/19(月) 03:40:46.00 ID:RYn53SnN0 accumlateは関数テンプレートだから実体化される時点でoperator+が見えてりゃOKのはず 言われてる通りADLで対象外なのが問題 http://mevius.5ch.net/test/read.cgi/tech/1683600652/249
250: デフォルトの名無しさん (ワッチョイ 256b-trtU) [sage] 2023/06/19(月) 05:38:23.58 ID:JAsvvATP0 >>237 (スマート)ポインタで持って要らなくなったら明示的にリリースする方法はあらゆるコンテナに対して使えるよね?笑 http://mevius.5ch.net/test/read.cgi/tech/1683600652/250
251: デフォルトの名無しさん (ワッチョイ f59c-Axrn) [sage] 2023/06/19(月) 08:48:03.43 ID:KLBRX38t0 >>250 >>223 http://mevius.5ch.net/test/read.cgi/tech/1683600652/251
252: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/19(月) 09:20:16.57 ID:Q4g6N6uX0 >>249 有難うございます グローバルスコープに定義した関数が見えないのは どうしてなんでしょうかね? それでは全然グローバルじゃないような気がするのですが 規格を決めるときに何か意図があったのでしょうかね? http://mevius.5ch.net/test/read.cgi/tech/1683600652/252
253: デフォルトの名無しさん (ワッチョイ a901-UvLK) [] 2023/06/19(月) 10:39:37.41 ID:RYn53SnN0 そもそもが名前空間内(よその演算子と混ざらないように)にある演算子オーバーロードを、外部からでも引数が合えば使えるように(std::operator+(a, b)とか書かないでいいように)するためのルールらしいから 外部の演算子見に行くのは目的に合わんのじゃね std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、あまりよろしくないやり方しようとしてると考えた方がいい (だから>>246のように書いた、継承したら一応arrayではな
くちゃんとVectorクラスに対する演算子だから通る) http://mevius.5ch.net/test/read.cgi/tech/1683600652/253
254: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/19(月) 11:53:54.08 ID:Q4g6N6uX0 >>253 >std名前空間内のarrayに外部から勝手に動作を追加しようとしてるんだから、 >あまりよろしくないやり方しようとしてると考えた方がいい なるほど たぶんこういう考え方なんでしょうね http://mevius.5ch.net/test/read.cgi/tech/1683600652/254
255: デフォルトの名無しさん (ワッチョイ 5efb-+wmN) [sage] 2023/06/19(月) 12:20:34.90 ID:4PINPeBN0 つまりvector<int>を使いなさいということ http://mevius.5ch.net/test/read.cgi/tech/1683600652/255
256: デフォルトの名無しさん (ワッチョイ 7d9b-trtU) [sage] 2023/06/19(月) 12:21:25.69 ID:wGtx/iKL0 >>251 安価ミス http://mevius.5ch.net/test/read.cgi/tech/1683600652/256
257: デフォルトの名無しさん (アウアウウー Sacd-9XmN) [sage] 2023/06/20(火) 00:04:57.81 ID:YSi65ASja 実引数依存の名前探索、Argument-Dependent Lookup (ADL)は、 Koenig lookup とも言う 「Cプログラミングの落とし穴」の著者、 Koenigが、C++ に入れる事を推奨した ADLを知っているなら、かなりのプロと言える http://mevius.5ch.net/test/read.cgi/tech/1683600652/257
258: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 00:18:46.72 ID:vGfe0Eju0 勉強になります http://mevius.5ch.net/test/read.cgi/tech/1683600652/258
259: デフォルトの名無しさん (アウアウウー Sacd-9XmN) [sage] 2023/06/20(火) 02:12:24.83 ID:1vctBLGTa 演算子のオーバーロードなら、フレンド関数とか? 非メンバの演算子オーバーロード | Programming Place Plus C++編【言語解説】 第35章 https://programming-place.net/ppp/contents/cpp/language/035.html http://mevius.5ch.net/test/read.cgi/tech/1683600652/259
260: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/20(火) 10:05:39.77 ID:IIzrqfbq0 状況を簡略化するとこう。 namespace ns { struct foo {}; template <class T> void bar(const T&) { T() + T(); } }; ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); } int main() { bar(ns::foo()); } ADL は「通常の探索に加えて」関連する名前空間も探索対象にするルールなのでグローバル名前空間も探索対象になるが、通常の探索では後ろで宣言 (定義) されているものは見つけることができない。 こ
の場合はエラーとして検出されるけど、可視な宣言と実際の定義の集合に食い違いは未定義という解釈でいいと思う。 (ちょっと自信はない……。) だから順序を変えれば通る。 namespace ns { struct foo{}; }; ns::foo operator+(const ns::foo& x, const ns::foo& y) { return ns::foo(); } namespace ns { template <class T> void bar(const T&) { T() + T(); } }; int main() { bar(ns::foo()); } 当然ながら std の (というかそれに限らず既存のライブラリの) 宣言の順序をどうこうするわけにもいかないので無理にカスタムしようとする
のは筋が悪いということになる。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/260
261: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 10:53:08.18 ID:vGfe0Eju0 >>260 >だから順序を変えれば通る。 最近手元のg++を更新しまして10.2.1 -> 12.2.0になったんですが 前者のケースが通らなくなりまして疑問に思っていたところでした 10.2.1は寛容で両方とも通るけどC++的には後者のみ通るのが正しい? http://mevius.5ch.net/test/read.cgi/tech/1683600652/261
262: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/20(火) 11:41:30.21 ID:IIzrqfbq0 >>261 前者はたぶん未定義かつ診断不要な状況なのでエラーを検出せずに通すのも正しい挙動で プログラマがそういう状況を作ってしまうのが仕様に反する (というか結果が保証されない) という解釈になると思う。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/262
263: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 13:36:04.44 ID:vGfe0Eju0 なるほどー 有難うございます http://mevius.5ch.net/test/read.cgi/tech/1683600652/263
264: デフォルトの名無しさん (JP 0H91-FhUT) [] 2023/06/20(火) 21:39:35.82 ID:Pk8V/jejH template<typename Callback> void func(Callback cb) { //cb(1); // A //cb(1,2);// B } void f1(int){} void f2(int,int){} int main(){func(f1);} AとBをコンパイル時に呼び分けたいんですけど どのように記述すればよいか教えていただけませんか? http://mevius.5ch.net/test/read.cgi/tech/1683600652/264
265: デフォルトの名無しさん (ワッチョイ 515f-9XmN) [sage] 2023/06/20(火) 22:18:37.18 ID:Cuq1USIJ0 is_invocableでおk http://mevius.5ch.net/test/read.cgi/tech/1683600652/265
266: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/20(火) 22:21:49.81 ID:IIzrqfbq0 >>264 渡されたコールバック関数の引数の数によって区別するってこと? 素朴な方法だとオーバーロードするのが手っ取り早いと思う。 void func(void (*cb)(int)) { cb(1); } void func(void (*cb)(int, int)) { cb(1, 2); } void f1(int) {} void f2(int, int) {} int main() { func(f1); func(f2); } http://mevius.5ch.net/test/read.cgi/tech/1683600652/266
267: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 22:27:55.14 ID:vGfe0Eju0 >>264 template<typename Callback> void func(Callback cb); template <> void func(void (*cb) (int)) { (*cb)(1); // A } template <> void func(void (*cb) (int, int)) { (*cb)(1,2);// B } void f1(int){} void f2(int,int){} int main(){func(f1);} http://mevius.5ch.net/test/read.cgi/tech/1683600652/267
268: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 22:29:12.98 ID:vGfe0Eju0 templateが意味ないね http://mevius.5ch.net/test/read.cgi/tech/1683600652/268
269: デフォルトの名無しさん (ワッチョイ 127f-L1I+) [sage] 2023/06/20(火) 22:39:00.27 ID:ui/rWsWf0 265が言うようにis_invocable使うとこんな感じ? template<typename Callback> void func(Callback cb) { if constexpr (std::is_invocable_v<Callback, int>) { cb(1); } else if constexpr (std::is_invocable_v<Callback, int, int>) { cb(1,2); } } http://mevius.5ch.net/test/read.cgi/tech/1683600652/269
270: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 22:41:37.75 ID:vGfe0Eju0 >>269 これって関係ないif節はコンパイル時に消えるの? http://mevius.5ch.net/test/read.cgi/tech/1683600652/270
271: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/20(火) 22:43:20.79 ID:IIzrqfbq0 >>270 消えるよ。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/271
272: デフォルトの名無しさん (JP 0H91-FhUT) [] 2023/06/20(火) 22:44:14.18 ID:Pk8V/jejH >>269 ありがとうございます。 gcc 13.1.0 でc++17でうまくいきました。 後出しで申し訳ありませんが、C++14でかけませんか? http://mevius.5ch.net/test/read.cgi/tech/1683600652/272
273: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/20(火) 22:47:27.45 ID:vGfe0Eju0 >>269,271 これは知らんかった 勉強になるなぁ http://mevius.5ch.net/test/read.cgi/tech/1683600652/273
274: デフォルトの名無しさん (JP 0H91-FhUT) [] 2023/06/20(火) 22:48:18.64 ID:Pk8V/jejH >>269 まさにこれをやりたかったです。 template<typename Callback> void func(Callback cb) { // こことか if constexpr (std::is_invocable_v<Callback, int>) { cb(1); } else if constexpr (std::is_invocable_v<Callback, int, int>) { cb(1,2); } // ここをどうしようか悩んでいました } http://mevius.5ch.net/test/read.cgi/tech/1683600652/274
275: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/20(火) 22:59:00.24 ID:IIzrqfbq0 >>272, >>274 ひとつの関数テンプレート中でやりたいってこと? if constexpr が導入される前だとオーバーロードなり特殊化なりで 別の関数として分離しないと書けないと思う。 is_invocable に相当するものは自分で書こうと思えば書けるが if constexpr は言語のコアの機能だからどうにもならんし……。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/275
276: デフォルトの名無しさん (JP 0H91-FhUT) [] 2023/06/20(火) 23:14:31.48 ID:Pk8V/jejH >>275 情報ありがとうございます ご掲示いただいたコードで勉強になりました。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/276
277: デフォルトの名無しさん (ワッチョイ 69f0-J7ro) [sage] 2023/06/20(火) 23:42:05.71 ID:zCL4VLm70 >>273 ザッツcostexprマジック http://mevius.5ch.net/test/read.cgi/tech/1683600652/277
278: デフォルトの名無しさん (ワッチョイ 69f0-J7ro) [sage] 2023/06/20(火) 23:43:57.61 ID:zCL4VLm70 n抜けてたwコストがかかる演算なのは確かだけどw constexprマジック!マジック! http://mevius.5ch.net/test/read.cgi/tech/1683600652/278
279: デフォルトの名無しさん (ワッチョイ 32fb-dYQK) [] 2023/06/21(水) 00:07:10.76 ID:2lh42auf0 C++11のSFIANE地獄へようこそ https://wandbox.org/permlink/2sfUVeEBrErqvI2R template関数の実体化が1つだけ成功して、 他が失敗するように仕掛ければ呼び分けは可能。 ただ見ての通り相当面倒なことを書かなきゃならない。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/279
280: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/21(水) 00:28:02.40 ID:CWKUsltc0 >>279 >>266と本質的に何が違うのか分からない 解説よろしく (templateでやってることは無駄なのでは?) http://mevius.5ch.net/test/read.cgi/tech/1683600652/280
281: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/21(水) 00:41:42.51 ID:3HBFHOpK0 >>280 いや、 >>279 のほうがちょっと柔軟で使いやすい。 たとえば void f3(long int, long int) {} みたいなのを渡したとき >>266 ではエラーになる。 引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと 厳密に int そのものでなければならないというのとでは制約の厳しさが違う。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/281
282: デフォルトの名無しさん (ワッチョイ 515f-9XmN) [sage] 2023/06/21(水) 00:42:09.27 ID:LxMKpynY0 templateでやるのは質問者の与えた要件だな 宿題なんじゃね、しらんけど http://mevius.5ch.net/test/read.cgi/tech/1683600652/282
283: デフォルトの名無しさん (ワッチョイ 32fb-9xvA) [] 2023/06/21(水) 00:52:13.25 ID:2lh42auf0 C++14にはif constexprが存在しないから template使ったオーバーロードしか手段がない 質問者がC++14環境でって言ってたからこんなクソ面倒くさいことやれば一応できるっていう例示 http://mevius.5ch.net/test/read.cgi/tech/1683600652/283
284: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/21(水) 01:17:47.52 ID:CWKUsltc0 >>281,283 ありがとう >引数として int を渡せる (int から暗黙に変換可能な仮引数を持っている) というのと >厳密に int そのものでなければならないというのとでは制約の厳しさが違う。 こういうことね http://mevius.5ch.net/test/read.cgi/tech/1683600652/284
285: デフォルトの名無しさん (ワッチョイ a901-UvLK) [] 2023/06/21(水) 04:29:46.61 ID:IDPPhD2V0 >>260 あー本来グローバルも対象になるのか、適当こいてスマソ だが>>248で質問者が言ってるように、元のコードで順序を変えてもダメなのよ 何故か考えてはちみつのコードを以下のようにしたら同様に通らなかった namespace ns { template <class T = int> struct foo{}; // added struct hoge{}; int operator +(const hoge &x, const hoge &y) {return 1;} }; ns::foo<> operator+(const ns::foo<>& x, const ns::f
oo<>& y) { return ns::foo<>(); } namespace ns { template <class T> void bar(const T&) { T() + T(); } }; int main() { bar(ns::foo<>()); } すでに名前空間内に同名の関数があった場合はダメっぽい http://mevius.5ch.net/test/read.cgi/tech/1683600652/285
286: デフォルトの名無しさん (ワッチョイ a901-UvLK) [] 2023/06/21(水) 09:44:10.00 ID:IDPPhD2V0 あ、すまんfooがクラステンプレートになってるの直し忘れた(直しても同じだが) http://mevius.5ch.net/test/read.cgi/tech/1683600652/286
287: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/21(水) 10:22:19.76 ID:3HBFHOpK0 >>285 名前探索 (name lookup) は狭い名前空間から探索していって 合致する名前があればそれより外側に同名の関数があっても オーバーロード解決に参加しない。 わかりやすい例で言えばメンバ関数は非メンバより優先されるし、 メンバ関数内にひとつでも候補が見つかった時点で非メンバ関数は一切考慮に入らなくなる。 void foo(void) {} struct bar { void baz(void) { // この foo は bar::foo のこと // 名前が見つかった時点でそれ
より外の名前空間は見に行かないので // 引数が合わなくても他の候補は試みられずエラーになる。 foo(1); } void foo(void) {} }; http://mevius.5ch.net/test/read.cgi/tech/1683600652/287
288: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0d3e-C6j3) [sage] 2023/06/21(水) 10:34:08.97 ID:3HBFHOpK0 例をちょっと間違えたのでやりなおし。 void foo(int) {} struct bar { void baz(void) { foo(1); } void foo(void) {} }; こうすると非メンバ関数の foo は候補にすらならないという話。 http://mevius.5ch.net/test/read.cgi/tech/1683600652/288
289: デフォルトの名無しさん (ワッチョイ 8101-1tDD) [sage] 2023/06/21(水) 11:00:59.24 ID:CWKUsltc0 g++更新にともない 自前ライブラリのビルドでエラーが出るようになって 悩んでたところを解説してくれてる マジで凄い人達だな http://mevius.5ch.net/test/read.cgi/tech/1683600652/289
290: デフォルトの名無しさん (ワッチョイ a901-UvLK) [] 2023/06/21(水) 11:31:26.94 ID:IDPPhD2V0 >メンバ関数内にひとつでも候補が見つかった時点で非メンバ関数は一切考慮に入らなくなる。 thx。確かにこれ経験したことあるわ・・・ややこしいし名前変えて対処したけど http://mevius.5ch.net/test/read.cgi/tech/1683600652/290
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 712 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.017s