[過去ログ] C++相談室 part157 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
803: 2021/10/20(水)15:34 ID:glY3n63N(9/11) AAS
お前らの家の冷蔵庫にエルビス・プレスリーがいないからといって、この世にエルビス・プレスリーがいないことの証明にはならないんだよ
血を吐くまで探せ
804: 2021/10/20(水)15:55 ID:4r95dvH8(1) AAS
不具合あるのを証明したほうがてっとりばやい
805: 2021/10/20(水)16:02 ID:glY3n63N(10/11) AAS
あぁ?わかって言ってんのか?
泥棒の証拠を泥棒に探させるのがアベガー品質だぞ
806(1): 2021/10/20(水)16:09 ID:Px+syONf(3/3) AAS
元々>>637がC++でもfgetsを使う俺は天才などとのたもうて
>>687がFILE*を使うなら例外安全をどう保証するのという話だったのが、
当の>>637は>>691でfread/fgets自体が例外を投げる可能性(?)という謎の問題を考え始め
>>710が根拠不明の2GB制限の話を持ち出し
問題があると考えるひとは存在しない2個の問題を同時に考えて混乱し
まあまあ分かってる人はRAIIすればいいじゃん(ってかfstreamでいいじゃん)で話が終わっている
まとめるとこんなところか?
807(1): 2021/10/20(水)16:17 ID:glY3n63N(11/11) AAS
挙証責任をガン無視できる文部科学省元事務次官前川喜平こそ最強
座右の銘は面従腹背、ライフワークは貧困調査
808: 2021/10/20(水)16:39 ID:NMVwWGr0(9/9) AAS
キチガイ極左は内ゲバで共食いしとれ
809(1): 2021/10/21(木)00:40 ID:ObBh/rk9(1/4) AAS
>>806
俺はcの標準ライブラリ使うならosの関数使えって言ってた人でアンカの中には登場しない人だけど
「根拠不明の2GB制限」についてはlarge file問題というのが昔あった
外部リンク:en.wikipedia.org
LinuxなどUnix系が64bit環境にほぼ移行した現在その問題はレアケースだとは思うけど
32bitアプリが割と残っているWindowsだと実際のところどうなのか分からない
でもfreadくらいは出来そうだと考えわざわざコード書いただけ(>>799)
ちなみにLinuxでもdebian系のantiX 19.4 32bit環境では#define _FILE_OFFSET_BITS 64がないとfopenがNULLを返していた
810: 2021/10/21(木)00:51 ID:l0SlZ35R(1/2) AAS
話の肝は「私が間違ってました。ごめんなさい」と素直に言えるかどうかなわけで
小室文書みたいな屁理屈の羅列はいらねンだわ
811(1): [sage] 2021/10/21(木)01:06 ID:5bux1k1I(1) AAS
>>807
NHK は メード イン ジャパン とか オーダー メード とか表記するのに
メイド 喫茶は なぜ メイド 表記なのですか?
812(2): 2021/10/21(木)01:19 ID:ObBh/rk9(2/4) AAS
ちなみに>>809の「cの標準ライブラリ使うならosの関数」という意味で以前実験した結果も貼っとく
read, fread, std::ifstream::readの比較
外部リンク:ideone.com
systemdのユーザーごとのRAMディスクを使っているのでそれがある環境でだけ動作する
ubuntu 20.04 64bit環境で実行した結果だと↓
$ g++ -O2 test.cpp -o test
$ ./test
227
267
225
省1
813: 2021/10/21(木)03:46 ID:Y6x8PTxQ(1) AAS
>>811
前者がmadeで後者がmaidだからじゃね?
814: 2021/10/21(木)07:45 ID:5PpYpVBN(1) AAS
以前はメードだったと思うけどね
815(1): 2021/10/21(木)11:19 ID:l0SlZ35R(2/2) AAS
ババ抜きはOld maidの日本語訳だよ
セクシズムやエイジズムはポリコレの立場から見てどうだろうね
816: 2021/10/21(木)12:39 ID:u1ltZUWw(1) AAS
regexで\dを使いたい場合はどうやるん?
817: 2021/10/21(木)14:10 ID:ObBh/rk9(3/4) AAS
外部リンク[html]:cpprefjp.github.io
818(1): 2021/10/21(木)17:33 ID:MfhbDLcG(1) AAS
>>812
その比較でなんで fread だけ遅いんだ?と思ってコード見たら fread じゃなくて fgets になってた。
あと read_cpp_standard() の if (std::cin.fail()) もたぶん f.fail() の間違い。
819: 2021/10/21(木)18:24 ID:/1ln80gU(1) AAS
>>815
フェミが言葉狩りのネタにしないのは何故
820: 2021/10/21(木)18:42 ID:7ERuyWg6(1) AAS
言葉狩りなんてないから
821(1): 2021/10/21(木)18:56 ID:ObBh/rk9(4/4) AAS
>>818
thx
>>812のコードは脳内破棄してくれ
指摘された部分を修正した
外部リンク:ideone.com
同環境での測定結果が↓
214
213
214
freadだとバッファリングされるからその分遅いのかと勝手に思ってたらそんなところから間違ってたとはすまんw
822(1): 2021/10/22(金)00:41 ID:bIdSm1HR(1/2) AAS
BB抜きが有ってGG抜きが無いのは差別
823: 2021/10/22(金)00:43 ID:bIdSm1HR(2/2) AAS
>>821
fread最強でFA
824: 2021/10/22(金)01:17 ID:JLUkeFzw(1) AAS
freadのバイナリな
DMA効くのは
テキストはゴミ
825: 2021/10/22(金)02:55 ID:ugOmuUc2(1) AAS
>>822
ジジ抜きもあるよ。
ジジ抜きはジョーカーを使わない。
適当な札を一枚抜いておいて組にならない札を最後まで持ってた奴が負け。
どれが負け札なのか最後までわからないというのがゲームの面白い部分。
ちなみに日本語でジジ抜きと呼ばれているゲームこそが Old maid (行き遅れ、お局様) の本来のルールで、
ペア (結婚相手) がないことを Old maid に喩えた命名になっている。
826(1): 2021/10/22(金)05:43 ID:I4IH0MDY(1/2) AAS
C++20ちょっと書き始めたらvscodeのインテリセンスが何でもないところにエラーの波線出しまくってくる
827: 2021/10/22(金)07:07 ID:viI1I/mh(1) AAS
DMAか、懐かしい
828(1): 2021/10/22(金)12:50 ID:xpSH/+fs(1) AAS
>>826
どの環境でそうなる?
829: 2021/10/22(金)13:37 ID:I4IH0MDY(2/2) AAS
>>828
OS: Windows 8.1 (64 bit)
コンパイラ: MinGW GCC 11.1.0
文句を言ってくる拡張機能は多分普通の"Microsoft C/C++ 拡張機能"でコードの例としては
外部リンク:wandbox.org
こんな感じ
エラーは
operator<=>: 戻り値の型だけで識別される関数はオーバーロードできません
requires(1個目): こちらでは requires 句は許可されていません (テンプレート関数ではありません)
vec: エイリアス テンプレート "vec" の引数リストがありません
省3
830(3): 2021/10/22(金)23:23 ID:Q/4+pM2R(1) AAS
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>>)
のような不定型配列を複数引数に取る関数を作りたいです。
831(1): 2021/10/22(金)23:45 ID:vgFDGRgE(1) AAS
std::variantつかうとか
832(2): 2021/10/23(土)01:05 ID:UQ/XjfNb(1/4) AAS
>>830
出来るといえば出来るんだが、動的型っぽいことを C++ でやろうとすると煩雑だよ。
std::any は何でも格納できるが使うときには結局は元の型として取りださないといけない。
格納することが出来たとして、その後にどういう風に使うのかによってデザインの仕方がかわってくる。
833(1): ハノン ◆QZaw55cn4c 2021/10/23(土)01:33 ID:0KDU0Kot(1/2) AAS
>>830
C++17以降、へえ、こんなこともできるんだ… 外部リンク[html]:cpprefjp.github.io
外部リンク:ideone.com
>>831
ありがとうございます!
834(1): ハノン ◆QZaw55cn4c 2021/10/23(土)01:34 ID:0KDU0Kot(2/2) AAS
>>832
うん、実用に供するまでには結構大変そう、使い道がわからん…
835(1): はちみつ餃子 ◆8X2XSCHEME 2021/10/23(土)01:57 ID:UQ/XjfNb(2/4) AAS
>>834
クラスの設計段階で抽象クラスとの継承関係を作っておくだとかいった方法で多相にするのが
旧来からの方法で、それができるならそのほうがまともなものになると思うんだが、
そうは言ってもユーザーからは弄れない既存のクラスをどうしても使いたいということも無くはない。
根本的な部分をいじれないときに場当たり的にどうにかするよりは std::any や std::variant を使ったら
少しはマシかもねという程度の話で、あまり積極的に使うようなものではないというのが私の感触だな。
836: 2021/10/23(土)08:10 ID:LycCK1PV(1) AAS
void*よりはちょっとマシって程度の感覚だな
837(1): 2021/10/23(土)10:04 ID:rMqegMI3(1) AAS
>>832
その後の使い方は、基本的には
全要素をany_castでstringにして使うつもりです。
不定型可変長のデータを受け取ってcsvファイル出力に使いたい感じです。
838(1): 2021/10/23(土)10:05 ID:bwy1yWHL(1) AAS
void*「むかしはあんなに愛してくれたのに…」
839: 2021/10/23(土)11:08 ID:FGy8rv7m(1) AAS
>>830
any使うんだったら、
vector<vector<any>> hoge;
じゃなくて
vector<any> hoge;
じゃない?
840(1): 2021/10/23(土)11:40 ID:KcnUiVki(1/2) AAS
>>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) {
省9
841(1): はちみつ餃子 ◆8X2XSCHEME 2021/10/23(土)13:07 ID:UQ/XjfNb(3/4) AAS
>>840
そう。 クラスごとに違う挙動が必要ならその違いはクラスの中に隠蔽されているべきで、
クラスを使う側で分岐するのはなんかちょっとあれだなという感じ。
型を調べて分岐するようなコードが嫌だから動的な型を調べる機能を意図的に入れなかった話は D&E にも書かれてる。
(最終的には typeid が導入されてしまったけど……)
ただそれは「型を追加したくなったら分岐も増やすのはめんどいしミスしそう」みたいな話なので、
十分に賢いユーティリティが標準で用意されている今ならそれほど強い動機でもないんだけどね。
842: 2021/10/23(土)13:12 ID:quaWTEll(1) AAS
C++はパラメトリック多相が無いからこういうのは面倒だよね。
とりあえずはstd::vector<std::function<std::string()>>に[v](){ return std::to_string(v); };
あたりを入れとくのが簡単かね。
conceptを「その制約を持つクラスの総称クラス」としてshared_ptrあたりで指定できるようになると便利なんだけどなぁ。
concept_shared_ptrとか用意してくれんかね。
843: はちみつ餃子 ◆8X2XSCHEME 2021/10/23(土)13:16 ID:UQ/XjfNb(4/4) AAS
>>837
any_cast での取り出しは「元の型」でなければならず、
string に変換可能な型であっても any_cast<string> は出来ない。
(やったら例外が飛ぶ)
最終的に文字列になると決めているなら文字列にしてから格納したほうがすっきりするんじゃないの。
844: 2021/10/23(土)14:23 ID:KcnUiVki(2/2) AAS
>>841
まあそうだよね。ありがとう。
845(3): 2021/10/24(日)08:17 ID:mo2+vXTQ(1/2) AAS
AA省
846: 2021/10/24(日)08:20 ID:mo2+vXTQ(2/2) AAS
>>772
コードブロック内のreturnがあるかもしれないんならチェックすれば良いやん?
>>763は普通の人ならチェックするでしょ、という主張
ところが>>722のような例外安全主義者ときては、RAII = 例外安全、で脳がショートしているのや
多分周りも能力に忖度して大した課題を与えていないんだと思う
847: 2021/10/24(日)08:40 ID:i4dOTOfz(1/2) AAS
上では例外安全にするとかしないとか言っていたような気がしたが少し主張が変わったのかな。
- 例外安全を求めるのは当然
- RAIIを使えば比較的例外安全を保証しやすい
- だからといってRAIIを使えば自動的に例外安全になるわけではない
結論としてはこんな感じだと思うが。
848: 2021/10/24(日)08:41 ID:7jz7Y9vl(1) AAS
チェックして例外出さないと解放されないコード書いたのか…
849: 2021/10/24(日)09:13 ID:1SVJ9Wvp(1) AAS
そりゃ例外安全もRAIIも魔法じゃないんだから使えば即安全になるというわけじゃないわな
「ちゃんと使えば」をすっ飛ばして>>845みたいなことを言い出すのも一種の思考停止だろうと思うわ
850: 2021/10/24(日)09:51 ID:v4numFpL(1) AAS
>>845
Barのデストラクタの責務は自分が確保したリソースをリークしないことだけだ
オブジェクトの外側でやってるスレッド間通信のことなんかBarは知らんし別に手当するだけの話
逆に聞くがRAIIを嫌がってBar* x = new Bar;とかにしたらなんか事態改善すんの?スレッド間通信を簡潔に書くための役に立つの?
851: 2021/10/24(日)10:24 ID:P2kmr3bK(1) AAS
そもそもRAIIが例外安全のためっていうイメージ全くないんだけど
リソースのお片付け(≒メモリリーク防止)が主目的ちゃうん?
852: 2021/10/24(日)10:36 ID:i4dOTOfz(2/2) AAS
例外が発生するとリソースを片付け損ねる場合があるってのが例外安全を欠く一番よくあるケースだと思うけど。
主目的がどうとかは別として。
853: 2021/10/24(日)10:45 ID:NLtlOSxj(1) AAS
>>845
例外を生じた場合でもXとなんらかの通信を行うべきなら
thread_connectionみたいなクラスを作ってデストラクタに整合性を保つためコードを書くのがいいかな
「アプリケーション固有の〜を送る」の部分にはそのオブジェクトのメソッド呼び出しにしておく
例外発生時にはデストラクタによってXスレッドに異常を通知してXスレッドが持つ状態の整合性を確保してもらう
Xに通知するのが単なる終了通知なら(成否を区別して処理しなくていいなら)全部デストラクタでいいかもね
854: 2021/10/24(日)10:47 ID:KyFc3YJo(1/4) AAS
結局コードがないのでまた空中戦になってますね
855: 2021/10/24(日)11:38 ID:IQSwOnqn(1) AAS
例外でデストラクタ呼ばないケースなんてあるんですか?
プログラム自体が止まるのは別として
856: 2021/10/24(日)12:07 ID:KyFc3YJo(2/4) AAS
リマインダー>>731
857(3): 2021/10/24(日)14:38 ID:KyFc3YJo(3/4) AAS
これ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() {
省4
858: ハノン ◆QZaw55cn4c 2021/10/24(日)15:13 ID:rOnHPdOM(1) AAS
>>838
「「最初から void * な実体」は作らない」「void (*)(void *, ...) くらいまでがせいぜいだ」というように努めていた私は愛し方が足りなかったのでしょうか?
最近の愛し方:2chスレ:tech
859(1): はちみつ餃子 ◆8X2XSCHEME 2021/10/24(日)18:37 ID:SzIAMYLD(1) AAS
>>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);
省6
860(1): 2021/10/24(日)19:35 ID:KyFc3YJo(4/4) AAS
>>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);
省8
861(1): はちみつ餃子 ◆8X2XSCHEME 2021/10/25(月)00:43 ID:dRHq7DJG(1/3) AAS
>>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;
省7
862: 2021/10/25(月)02:18 ID:LmZJdmU+(1/3) AAS
>>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;
省8
863: 2021/10/25(月)02:19 ID:LmZJdmU+(2/3) AAS
最後のコードは右上の設定ボタンから -std=c++17 を追加することで実行できます。
864: 2021/10/25(月)13:57 ID:p1HT8A4i(1) AAS
iostreamのシフト演算子オーバーロードは文句を言われてるがrangesのoperator|のオーバーロードはどうなんですかね
865: はちみつ餃子 ◆8X2XSCHEME 2021/10/25(月)14:01 ID:dRHq7DJG(2/3) AAS
感覚的にはまあ順当だろうと思う。
日付やパスで / を使うのに比べればよっぽど……。
866(2): 2021/10/25(月)15:38 ID:x4U5y7kU(1) AAS
組み込みの意味を持たないオーバーロード専用演算子があれば良かったのにな
用意しておかなかったのはC++の初期デザインの失敗だったと思う
867: 2021/10/25(月)16:09 ID:SLeimCOK(1) AAS
意味を持たない演算子が意図せず呼ばれてしまうくらいならコンパイルエラーになったほうがマシでは
868: はちみつ餃子 ◆8X2XSCHEME 2021/10/25(月)17:28 ID:dRHq7DJG(3/3) AAS
ところで Haskell で一定の記号の組み合わせは何でも新しい演算子として定義できる仕組みがある。
!#$%&*+./<=>? あたりとその他 Unicode 内いくらかも含めた組み合わせで演算子を作っていい。
優先順位も決められるし左結合か右結合かも決められる。
事実上無制限に違う字面の演算子を作れるんだよ。
<?+> とか #-. とか <<-~ みたいな演算子が実際に使われてるわけ。
こういう極端なのはさすがにあまりうらやましくはないよな……。
>>866
かといって有限の演算子をある程度に多く用意したところでオーバーロードを許すなら
どこかで全然違う意味で使われることもあるのは避けようがないし、
C++ くらいにスッパリと諦めるのもそれはそれで思い切りが良くて良いと思う。
869: 2021/10/25(月)17:51 ID:s1VnbLSn(1) AAS
演算子ってのはwellknownだからこそ意味があると思うんだけどな
演算子のオーバーロードもその“意味”から大きく逸脱しないことを求めていたと思うし
意味を持たないオーバーロード専用演算子ってのは
プログラマーによって意味が真逆になりかねないから危険だと思う
そんなことするぐらいなら普通に名前を付けて関数定義したほうがマシに思える
870(1): 2021/10/25(月)17:56 ID:5fKOgArh(1) AAS
そこら中訳わかんない記号だらけのソースとか悪夢でしかないなw
871: 2021/10/25(月)18:04 ID:LmZJdmU+(3/3) AAS
>>857の原因判明しました。
同一の問題がstackoverflowで解決されていたのでリンクだけ貼っておきます。
外部リンク:stackoverflow.com
上記に従った対策コードは以下のとおりです。
外部リンク:godbolt.org
872: 2021/10/25(月)20:01 ID:VZsrHh6g(1) AAS
>>866
リザーブの演算子持っとけって言いたいんだろうけどこう言う奴はいくつ持ってても足りねーとか言うからw
873: 2021/10/25(月)21:34 ID:3IW01+t9(1) AAS
演算子オーバーロードって自分で書くにはいいけど他人のコードを読むのが地獄だな。
874(2): 2021/10/25(月)21:35 ID:EqTxifVC(1) AAS
while (fread(&x, sizeof(double), 1, fin) > 0) {
fprintf(fout, "%5.4f\n", x);
}
こんな風に書くとコベリティ君がfreadは読み込んだバイト数を返すが使っていませんみたいなこと言い出すんだが
は?使ってますけど?みたいな気持ちしかないんだけど
何を求められてるんだろうか。
875: 2021/10/26(火)06:12 ID:lDQyydUS(1) AAS
>>874
そんなのシノプシスに聞けよ…
876: 2021/10/26(火)06:48 ID:ch+2e+/f(1) AAS
>>870
昔のAPLとかかw
877: 2021/10/26(火)08:08 ID:a/qQal0X(1) AAS
演算子に限らず、ある関数を特定の名前空間の内部だけ使えるように限定できたっけ?
「あるスコープだけこういう使い方」ならまだ混乱も少ないかね。
878(1): 2021/10/26(火)08:14 ID:FOkaXEb/(1) AAS
ん? それこそが名前空間の可視性制御だろ
879: 2021/10/26(火)08:14 ID:X4knYEql(1/2) AAS
関数内で構造体を定義し、その中でstatic関数を定義する
880: 2021/10/26(火)08:15 ID:X4knYEql(2/2) AAS
あ、違った
class内のprivate関数でいいんじゃね
881(1): 2021/10/26(火)08:27 ID:cqUp+YH+(1) AAS
>>878
名前空間の外にお漏らししないようにできたっけ?
同じ名前空間にクラス定義しなければADLも気にしないでいいのかしらん。
882(1): 2021/10/26(火)09:22 ID:tIXOLnPL(1) AAS
>>881
この手の話?
外部リンク:cpp.aquariuscode.com
883: 2021/10/26(火)10:05 ID:I5hwU/3x(1) AAS
>>874
fprintfはええんか?
884: 2021/10/26(火)10:21 ID:g/XkL0k7(1) AAS
niebloidの出番じゃないの?演算子オーバーロードには使えないが
885: 2021/10/26(火)12:31 ID:E+rw0Wy/(1) AAS
>>882
そうそう、そんな感じ。
実際には演算子を閉じ込めたい名前空間の中でクラスを定義しなければADLは影響しないけど、もし定義するとしてもこの技法で回避できそうだね。
886: 2021/10/26(火)12:54 ID:FaeDWsHu(1) AAS
今日もまた単発IDの曖昧発言onlyですね
887: ハノン ◆QZaw55cn4c 2021/10/31(日)10:43 ID:hT9enBIH(1) AAS
テステス
888(1): 2021/11/01(月)17:04 ID:uZUsIwlp(1/2) AAS
std::function を引数にとる関数を作ってるんだが、参照で渡すのとコピーで渡すのでどのように動作が変わるかわからない
参照で渡して良いですか
889: 2021/11/01(月)17:28 ID:2TKPTRzu(1) AAS
std::funcて中身は関数ポインタ―でしょ
コピーで済むものを参照で渡す必要はそもそもないんじゃないの
受け取り先で書き換えて返すなら別だけど
890(1): はちみつ餃子 ◆8X2XSCHEME 2021/11/01(月)17:29 ID:w5vOXkrp(1/2) AAS
>>888
「引数にとる」というのは実引数の型も std::function 型という意味?
891: 2021/11/01(月)17:41 ID:ja4QDiEt(1/2) AAS
保存目的なら値渡しのほうがよいらしい
外部リンク:stackoverflow.com
892(1): 2021/11/01(月)17:42 ID:P2kjdACs(1) AAS
コピーだろー
893(1): 2021/11/01(月)17:54 ID:uZUsIwlp(2/2) AAS
>>890
関数を想定しています
894: はちみつ餃子 ◆8X2XSCHEME 2021/11/01(月)17:58 ID:w5vOXkrp(2/2) AAS
>>893
仮引数の側を std::function の参照にしたところで、実引数の側が std::function ではないときは
変換して一時オブジェクトを作ってからその参照をとる形になるんだよ。
これは std::function に限らない一般原則。
どちらにしても新しいオブジェクトを構築するので参照にする意味がない。
895: 2021/11/01(月)18:35 ID:XqzqlHR8(1) AAS
クラスのメンバーにstd::functionをいくつか用意しておいて、
条件によりどれかのstd::functionを引数に取るprivateなメンバ関数とかなら参照にする意味はあるかもしれないw
896(3): 2021/11/01(月)19:28 ID:Qg2QcgLf(1) AAS
この流れで質問をば。
std::functionだと単体のR opetator()(Arg...)しか指定できないけど、複数のメソッドを指定できるように拡張するにはどうしたらいいかしらん?
継承じゃなくてtype erasure を使ったgeneral smart pointerとでもいうようなやつが欲しいんだけど、どこかに実装ないかなぁ。
897: 2021/11/01(月)19:49 ID:Iw+wFADq(1) AAS
anyの使いどころ?
898: 896 2021/11/01(月)20:35 ID:0sJcc+2w(1/2) AAS
anyだとメソッドを呼び出せないから機能が足りないですな。
メソッド呼び出しできるインターフェイス付きanyみたいな感じ。
用途は「指定したメソッドがあれば継承関係無しでブチ込める親クラスみたいなanyみたいなshared_ptr」だけど。
899: 2021/11/01(月)20:39 ID:ja4QDiEt(2/2) AAS
理解できてないけど普通のテンプレート引数を持つ関数じゃいかんの?
900(1): 896 2021/11/01(月)21:35 ID:0sJcc+2w(2/2) AAS
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
省4
901(1): 2021/11/01(月)22:33 ID:JtJuMIHt(1) AAS
>>900 外部リンク:www.google.com
902: 896 2021/11/02(火)00:28 ID:F29rpsLU(1) AAS
>901
ありがとう。こういうのもあるのね
……でも BOOST_TYPE_ERASURE_MEMBER を使ったコンセプトがWandboxで上手く動かないなぁ。
もうちょっと試してみるか。
上下前次1-新書関写板覧索設栞歴
あと 100 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.309s*