この質問は以前に尋ねられたことは知っていますが、かなり経験豊富なコーダーではありますが、私は答えを理解していないため、明確化。 「返信」リンクなどはありません。その上、これらの質問はかなり古いものでした。だから私は質問を新たに求めている。C++でstd :: functionのシグニチャをオーバーロードする方法
クラスがあり、+ =演算子がオーバーロードされています。私は1つの過負荷が裸関数ポインタをしたい、と他のSTD ::機能を取るために:
void operator+=(void (*handler)());
void operator+=(function<void (void *, T)> handler);
使用方法:コンパイラが判断できないため
MyClass a;
a += [](){ DoSomething(); };
a += [](void *x, T y){ DoSomething(); };
残念ながら、コードはコンパイルされません。 2番目のオーバーロードは最初の+ =コールには不適切であることを示します。
この問題を解決するには、演算子+ =メンバ関数をどのように定義すればよいですか?演算子の使用方法を変更する(たとえば、明示的なキャストを使用するなど)必要はありません。私は彼らが上記のように働くことを望みます。また
、同様に、以下の過負荷を持っていると便利だろう:
void operator+=(function<void()> handler);
しかし、再び、私は機能<>テンプレートの署名に基づいてオーバーロードすることはできません。
さらなる例については、このスレッドを参照してください:Isn't the template argument (the signature) of std::function part of its type? (私はそのスレッドで述べたさまざまなソリューションを導入しようとした、およびそれらのどれもをコンパイルしないだろう)
私は数に長年にわたってプログラミングをしてきました私のC++スキルは少し錆びています。
**大きな問題は:__what与えられた関数ポインタまたは 'std :: function'オブジェクトをあなたのオーバーロード' operator + = 'で実行しようとしていますか?__ – zaufi
@zaufi:それは関連していますが、大丈夫です。イベントハンドラ関数のstd :: vectorに追加します。私は本質的にC++で.NETイベントを実装しています。なぜなら、イベントやプロパティーはクローズのようなものであり、現代のプログラミング言語には絶対不可欠な機能だからです。 –
だから、あなたは 'std :: vector'をexaclyと' std :: function'でインスタンス化しなければなりません(私は 'void()')シグニチャを...そうですか? – zaufi