- 1 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 10:57:31.60 ID:JaaB5Egp.net]
- 前スレ
C++相談室 part156 https://mevius.5ch.net/test/read.cgi/tech/1621389313/
- 845 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 01:17:58.50 ID:JLUkeFzw.net]
- freadのバイナリな
DMA効くのは テキストはゴミ
- 846 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 02:55:23.69 ID:ugOmuUc2.net]
- >>822
ジジ抜きもあるよ。 ジジ抜きはジョーカーを使わない。 適当な札を一枚抜いておいて組にならない札を最後まで持ってた奴が負け。 どれが負け札なのか最後までわからないというのがゲームの面白い部分。 ちなみに日本語でジジ抜きと呼ばれているゲームこそが Old maid (行き遅れ、お局様) の本来のルールで、 ペア (結婚相手) がないことを Old maid に喩えた命名になっている。
- 847 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 05:43:15.83 ID:I4IH0MDY.net]
- C++20ちょっと書き始めたらvscodeのインテリセンスが何でもないところにエラーの波線出しまくってくる
- 848 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 07:07:31.23 ID:viI1I/mh.net]
- DMAか、懐かしい
- 849 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 12:50:15.03 ID:xpSH/+fs.net]
- >>826
どの環境でそうなる?
- 850 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 13:37:10.17 ID:I4IH0MDY.net]
- >>828
OS: Windows 8.1 (64 bit) コンパイラ: MinGW GCC 11.1.0 文句を言ってくる拡張機能は多分普通の"Microsoft C/C++ 拡張機能"でコードの例としては https://wandbox.org/permlink/Fcqjvfqt8rWVqren こんな感じ エラーは operator<=>: 戻り値の型だけで識別される関数はオーバーロードできません requires(1個目): こちらでは requires 句は許可されていません (テンプレート関数ではありません) vec: エイリアス テンプレート "vec" の引数リストがありません v: ';' が必要です という感じ まあエイリアスのやつはC++17でも言えるけど
- 851 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 23:23:13.68 ID:Q/4+pM2R.net]
- Pythonのリストのように不定型の配列を作るにはどうすればいいですか?
vector<int> a; vector<double> b; vector<vector<any>> hoge; hoge.emplace_back(a); hoge.emplace_back(b); みたいなことをしたいですが、エラーになりました。 最終目的は、 void f(vector<vector<any>>, vector<vector<any>>) のような不定型配列を複数引数に取る関数を作りたいです。
- 852 名前:デフォルトの名無しさん mailto:sage [2021/10/22(金) 23:45:34.05 ID:vgFDGRgE.net]
- std::variantつかうとか
- 853 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 01:05:44.90 ID:UQ/XjfNb.net]
- >>830
出来るといえば出来るんだが、動的型っぽいことを C++ でやろうとすると煩雑だよ。 std::any は何でも格納できるが使うときには結局は元の型として取りださないといけない。 格納することが出来たとして、その後にどういう風に使うのかによってデザインの仕方がかわってくる。
- 854 名前:ハノン mailto:sage [2021/10/23(土) 01:33:33.73 ID:0KDU0Kot.net]
- >>830
C++17以降、へえ、こんなこともできるんだ… https://cpprefjp.github.io/reference/variant/variant.html https://ideone.com/G8IPFR >>831 ありがとうございます!
- 855 名前:ハノン mailto:sage [2021/10/23(土) 01:34:50.09 ID:0KDU0Kot.net]
- >>832
うん、実用に供するまでには結構大変そう、使い道がわからん…
- 856 名前:はちみつ餃子 mailto:sage [2021/10/23(土) 01:57:47.58 ID:UQ/XjfNb.net]
- >>834
クラスの設計段階で抽象クラスとの継承関係を作っておくだとかいった方法で多相にするのが 旧来からの方法で、それができるならそのほうがまともなものになると思うんだが、 そうは言ってもユーザーからは弄れない既存のクラスをどうしても使いたいということも無くはない。 根本的な部分をいじれないときに場当たり的にどうにかするよりは std::any や std::variant を使ったら 少しはマシかもねという程度の話で、あまり積極的に使うようなものではないというのが私の感触だな。
- 857 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 08:10:22.62 ID:LycCK1PV.net]
- void*よりはちょっとマシって程度の感覚だな
- 858 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 10:04:52.59 ID:rMqegMI3.net]
- >>832
その後の使い方は、基本的には 全要素をany_castでstringにして使うつもりです。 不定型可変長のデータを受け取ってcsvファイル出力に使いたい感じです。
- 859 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 10:05:50.17 ID:bwy1yWHL.net]
- void*「むかしはあんなに愛してくれたのに…」
- 860 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 11:08:12.01 ID:FGy8rv7m.net]
- >>830
any使うんだったら、 vector<vector<any>> hoge; じゃなくて vector<any> hoge; じゃない?
- 861 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 11:40:12.00 ID:KcnUiVki.net]
- >>835
>>833じゃないけど>>833のdump()を例えば template<class... Args> void dump(const std::variant<Args...>& e) { std::visit([](const auto& x){ std::cout << " " << x << std::endl; }, e); } template<class V> void dump(const std::vector<V>& v) { for (const auto& e: v) { dump(e); } } みたいにするんなら class Dumpable { virtual void dump() = 0; }; みたいな抽象クラス作って素直にArgsの各classが継承(実装)した方がいいと思うってこと?
- 862 名前:はちみつ餃子 mailto:sage [2021/10/23(土) 13:07:50.50 ID:UQ/XjfNb.net]
- >>840
そう。 クラスごとに違う挙動が必要ならその違いはクラスの中に隠蔽されているべきで、 クラスを使う側で分岐するのはなんかちょっとあれだなという感じ。 型を調べて分岐するようなコードが嫌だから動的な型を調べる機能を意図的に入れなかった話は D&E にも書かれてる。 (最終的には typeid が導入されてしまったけど……) ただそれは「型を追加したくなったら分岐も増やすのはめんどいしミスしそう」みたいな話なので、 十分に賢いユーティリティが標準で用意されている今ならそれほど強い動機でもないんだけどね。
- 863 名前:デフォルトの名無しさん [2021/10/23(土) 13:12:23.67 ID:quaWTEll.net]
- C++はパラメトリック多相が無いからこういうのは面倒だよね。
とりあえずはstd::vector<std::function<std::string()>>に[v](){ return std::to_string(v); }; あたりを入れとくのが簡単かね。 conceptを「その制約を持つクラスの総称クラス」としてshared_ptrあたりで指定できるようになると便利なんだけどなぁ。 concept_shared_ptrとか用意してくれんかね。
- 864 名前:はちみつ餃子 mailto:sage [2021/10/23(土) 13:16:46.64 ID:UQ/XjfNb.net]
- >>837
any_cast での取り出しは「元の型」でなければならず、 string に変換可能な型であっても any_cast<string> は出来ない。 (やったら例外が飛ぶ) 最終的に文字列になると決めているなら文字列にしてから格納したほうがすっきりするんじゃないの。
- 865 名前:デフォルトの名無しさん mailto:sage [2021/10/23(土) 14:23:02.68 ID:KcnUiVki.net]
- >>841
まあそうだよね。ありがとう。
- 866 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:17:03.78 ID:mo2+vXTQ.net]
- >>771-772
以下のような場合についてBarクラスがRAIIであるというだけでどう例外安全にできるのかお考えをお聞かせ願えますか void foo() { { // 何かのコードブロック (try { } catch { } のtry{ } とかでも良い Bar x, y, z; (例外を生じる可能性があるコード) アプリケーション固有の別スレッドXにイベントなりシグナルを送る } } >>723 上に書いたようなケースを踏まえてっ例外安全に言及している>>720と>>721に対して 理解しいないまま捨て台詞を残して逃走した>>722とか、
- 867 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:20:03.55 ID:mo2+vXTQ.net]
- >>772
コードブロック内のreturnがあるかもしれないんならチェックすれば良いやん? >>763は普通の人ならチェックするでしょ、という主張 ところが>>722のような例外安全主義者ときては、RAII = 例外安全、で脳がショートしているのや 多分周りも能力に忖度して大した課題を与えていないんだと思う
- 868 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:40:20.31 ID:i4dOTOfz.net]
- 上では例外安全にするとかしないとか言っていたような気がしたが少し主張が変わったのかな。
- 例外安全を求めるのは当然 - RAIIを使えば比較的例外安全を保証しやすい - だからといってRAIIを使えば自動的に例外安全になるわけではない 結論としてはこんな感じだと思うが。
- 869 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 08:41:27.07 ID:7jz7Y9vl.net]
- チェックして例外出さないと解放されないコード書いたのか…
- 870 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 09:13:23.68 ID:1SVJ9Wvp.net]
- そりゃ例外安全もRAIIも魔法じゃないんだから使えば即安全になるというわけじゃないわな
「ちゃんと使えば」をすっ飛ばして>>845みたいなことを言い出すのも一種の思考停止だろうと思うわ
- 871 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 09:51:02.52 ID:v4numFpL.net]
- >>845
Barのデストラクタの責務は自分が確保したリソースをリークしないことだけだ オブジェクトの外側でやってるスレッド間通信のことなんかBarは知らんし別に手当するだけの話 逆に聞くがRAIIを嫌がってBar* x = new Bar;とかにしたらなんか事態改善すんの?スレッド間通信を簡潔に書くための役に立つの?
- 872 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:24:44.80 ID:P2kmr3bK.net]
- そもそもRAIIが例外安全のためっていうイメージ全くないんだけど
リソースのお片付け(≒メモリリーク防止)が主目的ちゃうん?
- 873 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:36:38.75 ID:i4dOTOfz.net]
- 例外が発生するとリソースを片付け損ねる場合があるってのが例外安全を欠く一番よくあるケースだと思うけど。
主目的がどうとかは別として。
- 874 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:45:51.44 ID:NLtlOSxj.net]
- >>845
例外を生じた場合でもXとなんらかの通信を行うべきなら thread_connectionみたいなクラスを作ってデストラクタに整合性を保つためコードを書くのがいいかな 「アプリケーション固有の〜を送る」の部分にはそのオブジェクトのメソッド呼び出しにしておく 例外発生時にはデストラクタによってXスレッドに異常を通知してXスレッドが持つ状態の整合性を確保してもらう Xに通知するのが単なる終了通知なら(成否を区別して処理しなくていいなら)全部デストラクタでいいかもね
- 875 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 10:47:45.55 ID:KyFc3YJo.net]
- 結局コードがないのでまた空中戦になってますね
- 876 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 11:38:44.49 ID:IQSwOnqn.net]
- 例外でデストラクタ呼ばないケースなんてあるんですか?
プログラム自体が止まるのは別として
- 877 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 12:07:45.68 ID:KyFc3YJo.net]
- リマインダー>>731
- 878 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 14:38:53.43 ID:KyFc3YJo.net]
- これg++ 9.3だとstd::endlがなぜかconst variant<>と思われてエラーになってるみたいなんだけど、なぜ?
#include <variant> #include <iostream> using namespace std; template<class C, class... Args> C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl; return 0; } https://godbolt.org/z/dbodW3xfG
- 879 名前:ハノン mailto:sage [2021/10/24(日) 15:13:35.43 ID:rOnHPdOM.net]
- >>838
「「最初から void * な実体」は作らない」「void (*)(void *, ...) くらいまでがせいぜいだ」というように努めていた私は愛し方が足りなかったのでしょうか? 最近の愛し方:https://mevius.5ch.net/test/read.cgi/tech/1624028577/305
- 880 名前:はちみつ餃子 mailto:sage [2021/10/24(日) 18:37:46.86 ID:SzIAMYLD.net]
- >>857
std::endl は関数テンプレートなので型と比較しようとするとインスタンス化に失敗するというエラーだと思う。 (std::endl を普通に使うときは左辺の型を利用して推論される。) 型を明示して渡せば variant との比較に失敗して通常の改行として解釈してくれる。 #include <variant> #include <iostream> using namespace std; template<class C, class... Args> C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << static_cast<std::ostream&(*)(std::ostream&)>(std::endl); return 0; }
- 881 名前:デフォルトの名無しさん mailto:sage [2021/10/24(日) 19:35:48.44 ID:KyFc3YJo.net]
- >>859
う〜ん、よく分かりませんね。確かに勝手にendlは[with _CharT = char; _Traits = std::char_traits<char>]なbasic_ostreamを 引数にとって返すと想定しちゃってましたが、その時点でインスタンス化しようとしてエラー出す理由が分からない・・・ 例えばテンプレート引数を直指定しても #include <variant> #include <iostream> using namespace std; template<class C, class... Args> C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl<char>; // ここが違う return 0; } 同様にエラーのままでした。castしたときだけなぜ判定失敗してくれるのかもう少し考えてみます。 ありがとうございました。
- 882 名前:はちみつ餃子 mailto:sage [2021/10/25(月) 00:43:36.43 ID:dRHq7DJG.net]
- >>860
左辺が曖昧だからかもしれない。 左辺の型を std::ostream で固定すれば通る。 #include <variant> #include <iostream> using namespace std; template<class C, class... Args> std::ostream& operator<<(std::ostream& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl<char>; return 0; } でもこのとき型変数 C は不要だなと思って class C を削るとエラーになるんだよな。 なんだかよくわかんないね。
- 883 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 02:18:03.94 ID:LmZJdmU+.net]
- >>861
度々ありがとうございます。再現確認したところ、確かに余計なテンプレート引数が1つあるだけでこのエラーが出ないみたいですね。 試しに元のコード(>>857)に余計なパラメータを1つ入れるだけでも通りました。 #include <variant> #include <iostream> using namespace std; template<class T, class C, class... Args> // ダミーパラメータT追加 C& operator<<(C& out, const variant<Args...>& v) { visit([&](auto& x){out << x;}, v); return out; } int main() { cout << endl; return 0; } ほんとによく分かりませんね。 castの件は第2引数のvがテンプレート関数でなければ弾けるということのような気がします。 https://onlinegdb.com/ol3BYChIx
- 884 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 02:19:56.83 ID:LmZJdmU+.net]
- 最後のコードは右上の設定ボタンから -std=c++17 を追加することで実行できます。
- 885 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 13:57:01.70 ID:p1HT8A4i.net]
- iostreamのシフト演算子オーバーロードは文句を言われてるがrangesのoperator|のオーバーロードはどうなんですかね
- 886 名前:はちみつ餃子 mailto:sage [2021/10/25(月) 14:01:06.87 ID:dRHq7DJG.net]
- 感覚的にはまあ順当だろうと思う。
日付やパスで / を使うのに比べればよっぽど……。
- 887 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 15:38:37.13 ID:x4U5y7kU.net]
- 組み込みの意味を持たないオーバーロード専用演算子があれば良かったのにな
用意しておかなかったのはC++の初期デザインの失敗だったと思う
- 888 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 16:09:42.75 ID:SLeimCOK.net]
- 意味を持たない演算子が意図せず呼ばれてしまうくらいならコンパイルエラーになったほうがマシでは
- 889 名前:はちみつ餃子 mailto:sage [2021/10/25(月) 17:28:55.78 ID:dRHq7DJG.net]
- ところで Haskell で一定の記号の組み合わせは何でも新しい演算子として定義できる仕組みがある。
!#$%&*+./<=>? あたりとその他 Unicode 内いくらかも含めた組み合わせで演算子を作っていい。 優先順位も決められるし左結合か右結合かも決められる。 事実上無制限に違う字面の演算子を作れるんだよ。 <?+> とか #-. とか <<-~ みたいな演算子が実際に使われてるわけ。 こういう極端なのはさすがにあまりうらやましくはないよな……。 >>866 かといって有限の演算子をある程度に多く用意したところで
- 890 名前:オーバーロードを許すなら
どこかで全然違う意味で使われることもあるのは避けようがないし、 C++ くらいにスッパリと諦めるのもそれはそれで思い切りが良くて良いと思う。 [] - [ここ壊れてます]
- 891 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 17:51:03.08 ID:s1VnbLSn.net]
- 演算子ってのはwellknownだからこそ意味があると思うんだけどな
演算子のオーバーロードもその“意味”から大きく逸脱しないことを求めていたと思うし 意味を持たないオーバーロード専用演算子ってのは プログラマーによって意味が真逆になりかねないから危険だと思う そんなことするぐらいなら普通に名前を付けて関数定義したほうがマシに思える
- 892 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 17:56:20.95 ID:5fKOgArh.net]
- そこら中訳わかんない記号だらけのソースとか悪夢でしかないなw
- 893 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 18:04:59.44 ID:LmZJdmU+.net]
- >>857の原因判明しました。
同一の問題がstackoverflowで解決されていたのでリンクだけ貼っておきます。 https://stackoverflow.com/questions/52845621/cant-stream-stdendl-with-overloaded-operator-for-stdvariant 上記に従った対策コードは以下のとおりです。 https://godbolt.org/z/8e9o3MnaG
- 894 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 20:01:58.87 ID:VZsrHh6g.net]
- >>866
リザーブの演算子持っとけって言いたいんだろうけどこう言う奴はいくつ持ってても足りねーとか言うからw
- 895 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 21:34:55.28 ID:3IW01+t9.net]
- 演算子オーバーロードって自分で書くにはいいけど他人のコードを読むのが地獄だな。
- 896 名前:デフォルトの名無しさん mailto:sage [2021/10/25(月) 21:35:04.23 ID:EqTxifVC.net]
- while (fread(&x, sizeof(double), 1, fin) > 0) {
fprintf(fout, "%5.4f\n", x); } こんな風に書くとコベリティ君がfreadは読み込んだバイト数を返すが使っていませんみたいなこと言い出すんだが は?使ってますけど?みたいな気持ちしかないんだけど 何を求められてるんだろうか。
- 897 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 06:12:19.30 ID:lDQyydUS.net]
- >>874
そんなのシノプシスに聞けよ…
- 898 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 06:48:54.44 ID:ch+2e+/f.net]
- >>870
昔のAPLとかかw
- 899 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 08:08:42.05 ID:a/qQal0X.net]
- 演算子に限らず、ある関数を特定の名前空間の内部だけ使えるように限定できたっけ?
「あるスコープだけこういう使い方」ならまだ混乱も少ないかね。
- 900 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 08:14:06.41 ID:FOkaXEb/.net]
- ん? それこそが名前空間の可視性制御だろ
- 901 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 08:14:48.16 ID:X4knYEql.net]
- 関数内で構造体を定義し、その中でstatic関数を定義する
- 902 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 08:15:27.77 ID:X4knYEql.net]
- あ、違った
class内のprivate関数でいいんじゃね
- 903 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 08:27:02.14 ID:cqUp+YH+.net]
- >>878
名前空間の外にお漏らししないようにできたっけ? 同じ名前空間にクラス定義しなければADLも気にしないでいいのかしらん。
- 904 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 09:22:33.47 ID:tIXOLnPL.net]
- >>881
この手の話? cpp.aquariuscode.com/adl-firewall
- 905 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 10:05:37.17 ID:I5hwU/3x.net]
- >>874
fprintfはええんか?
- 906 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 10:21:21.31 ID:g/XkL0k7.net]
- niebloidの出番じゃないの?演算子オーバーロードには使えないが
- 907 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 12:31:52.75 ID:E+rw0Wy/.net]
- >>882
そうそう、そんな感じ。 実際には演算子を閉じ込めたい名前空間の中でクラスを定義しなければADLは影響しないけど、もし定義するとしてもこの技法で回避できそうだね。
- 908 名前:デフォルトの名無しさん mailto:sage [2021/10/26(火) 12:54:35.40 ID:FaeDWsHu.net]
- 今日もまた単発IDの曖昧発言onlyですね
- 909 名前:ハノン mailto:sage [2021/10/31(日) 10:43:09.43 ID:hT9enBIH.net]
- テステス
- 910 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 17:04:38.20 ID:uZUsIwlp.net]
- std::function を引数にとる関数を作ってるんだが、参照で渡すのとコピーで渡すのでどのように動作が変わるかわからない
参照で渡して良いですか
- 911 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 17:28:34.89 ID:2TKPTRzu.net]
- std::funcて中身は関数ポインタ―でしょ
コピーで済むものを参照で渡す必要はそもそもないんじゃないの 受け取り先で書き換えて返すなら別だけど
- 912 名前:はちみつ餃子 mailto:sage [2021/11/01(月) 17:29:06.34 ID:w5vOXkrp.net]
- >>888
「引数にとる」というのは実引数の型も std::function 型という意味?
- 913 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 17:41:35.71 ID:ja4QDiEt.net]
- 保存目的なら値渡しのほうがよいらしい
https://stackoverflow.com/questions/18365532/should-i-pass-an-stdfunction-by-const-reference
- 914 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 17:42:17.47 ID:P2kjdACs.net]
- コピーだろー
- 915 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 17:54:17.61 ID:uZUsIwlp.net]
- >>890
関数を想定しています
- 916 名前:はちみつ餃子 mailto:sage [2021/11/01(月) 17:58:12.22 ID:w5vOXkrp.net]
- >>893
仮引数の側を std::function の参照にしたところで、実引数の側が std::function ではないときは 変換して一時オブジェクトを作ってからその参照をとる形になるんだよ。 これは std::function に限らない一般原則。 どちらにしても新しいオブジェクトを構築するので参照にする意味がない。
- 917 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 18:35:36.43 ID:XqzqlHR8.net]
- クラスのメンバーにstd::functionをいくつか用意しておいて、
条件によりどれかのstd::functionを引数に取るprivateなメンバ関数とかなら参照にする意味はあるかもしれないw
- 918 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 19:28:38.40 ID:Qg2QcgLf.net]
- この流れで質問をば。
std::functionだと単体のR opetator()(Arg...)しか指定できないけど、複数のメソッドを指定できるように拡張するにはどうしたらいいかしらん? 継承じゃなくてtype erasure を使ったgeneral smart pointerとでもいうようなやつが欲しいんだけど、どこかに実装ないかなぁ。
- 919 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 19:49:46.26 ID:Iw+wFADq.net]
- anyの使いどころ?
- 920 名前:896 mailto:sage [2021/11/01(月) 20:35:42.39 ID:0sJcc+2w.net]
- anyだとメソッドを呼び出せないから機能が足りないですな。
メソッド呼び出しできるインターフェイス付きanyみたいな感じ。 用途は「指定したメソッドがあれば継承関係無しでブチ込める親クラスみたいなanyみたいなshared_ptr」だけど。
- 921 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 20:39:54.69 ID:ja4QDiEt.net]
- 理解できてないけど普通のテンプレート引数を持つ関数じゃいかんの?
- 922 名前:896 mailto:sage [2021/11/01(月) 21:35:17.71 ID:0sJcc+2w.net]
- Haskellの型タイプというのがイメージに近いか。
具体例をだしてみると、 class A { public: string test1() { return string("A1"); }; string test2() { return string("A2"); }; }; class B { public: string test1() { return string("B1"); }; string test2() { return string("B2"); }; }; vector<generic_ptr<string test()>>c; c.push_back(make_shared<A>()); c.push_back(make_shared<B>()); c[0]->test1(); // A1 c[1]->test1(); // B1 c[0]->test2(); // A2 c[1]->test2(); // B2 みたいに、anyみたいに雑多なオブジェクトをブチ込むけど、 anyとは違ってそのまま共通メソッドを呼び出せるようにする、 というのが狙いね。
- 923 名前:デフォルトの名無しさん mailto:sage [2021/11/01(月) 22:33:44.83 ID:JtJuMIHt.net]
- >>900 https://www.google.com/search?q=Boost.TypeErasure
- 924 名前:896 mailto:sage [2021/11/02(火) 00:28:12.27 ID:F29rpsLU.net]
- >901
ありがとう。こういうのもあるのね ……でも BOOST_TYPE_ERASURE_MEMBER を使ったコンセプトがWandboxで上手く動かないなぁ。 もうちょっと試してみるか。
- 925 名前:デフォルトの名無しさん mailto:sega [2021/11/02(火) 10:51:55.89 ID:7a5iqwfV.net]
- std::thread で作られるスレッドって
スタックサイズはデフォルトいくつなん? 変更とかできるん?
- 926 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 10:59:21.25 ID:oKrr57AH.net]
- >>903
スタックなんて概念がないのに制御できるわけがない
- 927 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 11:48:47.80 ID:LR6fq+wY.net]
- linuxならulimit -sかpthread_attr_setstacksizeで設定できる
ただ確保されるのは仮想メモリなので現実的にはその設定あんまり使い所がない そしてC++とか関係ない
- 928 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 13:09:21.89 ID:TehqQXLJ.net]
- stdよりposixのほうが洗練されてるよな
- 929 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 17:28:47.39 ID:LR6fq+wY.net]
- 何いってんの?この人
- 930 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 19:04:22.54 ID:TehqQXLJ.net]
- 意味わかんなくてpthread使ってんなら相当頭悪い
- 931 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 19:13:49.36 ID:U4IKz2Wy.net]
- むだに喧嘩すんなよ
- 932 名前:デフォルトの名無しさん mailto:sage [2021/11/02(火) 19:28:12.57 ID:LR6fq+wY.net]
- 比較対象がおかしいんだからしょうがなくね?w
- 933 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 00:18:59.36 ID:2vTbLoUN.net]
- 基底クラスに定数持たせるけど値は継承先で決めたい。
例)Carクラスには計算に使うが変更はしない定数 weight hight width があり、それは継承した車種クラス毎に異なる、など。 下記でコンパイル通るようですが、定数増えると見づらく、もっとスマートなやり方あったらご教授願いたく。 class Car { protected: const double weight, height, width; public: Car(double w, double h, double wd) : weight(w) , height(h) , width(wd) {} }; class CarA : public Car { CarA() : Car(1000.0, 1.8, 1,8) {} };
- 934 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 00:22:58.93 ID:O1PLiy99.net]
- 別に普通だと思うけどどの辺が見づらいと思うんだ?
- 935 名前:はちみつ餃子 mailto:sage [2021/11/05(金) 01:26:19.60 ID:8QrXrM3i.net]
- 値が const であるだけでなく static であって欲しいという意図なんじゃないかと想像する。
- 936 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 01:29:07.53 ID:zGuhJhpK.net]
- クラステンプレート化すればいいじゃない
template<double W, double H, double WD>
- 937 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 01:41:20.30 ID:gd3zcTPm.net]
- doubleってテンプレート引数OKになったの?
- 938 名前:はちみつ餃子 mailto:sage [2021/11/05(金) 01:48:57.72 ID:8QrXrM3i.net]
- >>915
C++20 で非型テンプレート引数の大幅な緩和があった。
- 939 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 02:25:46.30 ID:Xs8oV2Az.net]
- C++20では普通に使えるかもだけど、引数に名前を付ける風のトリックがあるらしい
https://www.fluentcpp.com/2018/12/14/named-arguments-cpp/
- 940 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 05:55:16.82 ID:caWVwyr0.net]
- >>911
virtual double weight() const = 0; じゃあかんの?
- 941 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 06:25:31.61 ID:8h2e+y9J.net]
- >>912
引数が数値ばかりで10個とかあると確かに何を指定してるのかぱっと見わかんなくなりそう C++なら>>918に一票だけど参照する時に ( ) が要るからこう言うケースだとC#のプロパティが欲しくなる
- 942 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 07:38:38.22 ID:gd3zcTPm.net]
- C++20で指示付き初期化が出来るようなので、もしC++20が使えるなら定数を構造体にまとめたらいいかも
https://cpprefjp.github.io/lang/cpp20/designated_initialization.html
- 943 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 08:22:45.14 ID:OHT8JXtH.net]
- >>911
Builderパターンとか? 面倒だったらDirectorクラスは省略しても問題なさそう。 類型的な車種ごとにBuilderを派生させてデフォルト値を決めといてもいいかと。
- 944 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 12:38:49.71 ID:gSSLx8YQ.net]
- >>919
参照するときに()ていうのは a=car.weight(); ていうこと? a=car.weight; と表記したいならoperator=をオーバーロードすればいいかと
- 945 名前:デフォルトの名無しさん mailto:sage [2021/11/05(金) 13:46
]
- [ここ壊れてます]
|

|