C ++で簡単なコールバックを作成する必要がありますか? boost :: functionを使用する必要がありますか?
質問
次のようなコードがあるとします:
class Visitor {
public:
Visitor(callBackFunction) {}
void visit() {
//do something useful
invokeCallback();
}
}
class ClassThatCanBeVisited {
Visitor &visitor;
public:
ClassThatCanBeVisited(Visitor &_visitor) : visitor(_visitor){}
void someUsefulMethod() {
int data= 42;
visitor.visit(data);
}
};
void callBackFunction() {
//do something useful in the context of the Main file
}
int main() {
Visitor visitor;
ClassThatCanBeVisited foo(visitor);
foo.someUsefulMethod();
}
Visitor :: visit()が呼び出されるたびに呼び出される単純なコールバックを作成する必要があります。私はおそらくVisitorの中にコールバックのコードを置くべきであることを知っていますが、それは異なるコンテキストにあるので、callBackFunction()をVisitorに渡して、コールバック関数を呼び出せるようにします。
ウェブ上で何かを探して、boost :: functionを見ましたが、c ++にはすでに基本的なファンクターがあります。
コードをわかりやすくするために、どれを使用すればよいですか?コールバックは単純なvoid()関数になりますが、成長する可能性があり、将来は決してわかりません:)
これを行うための推奨される方法は何ですか?
解決
boost :: functionを使用したくない場合は、コールバックインターフェイスとその階層を使用できます。
class VisitorCallback
{
public:
virtual void handle( const Visitor& ) = 0;
};
boost :: functionを持っているか使用できる場合、それを使用すると、これらのコールバッククラスをすべて削除するのに適した方法になります。
編集:
@edisongustavo:
boost :: functionおよびboost :: bindは、おそらくコードを読みやすくしません。ただし、コールバックおよび任意のクラスの既存の関数として、無料の関数(クラス外の関数と静的クラス関数を意味します)を渡すことができます。
ブースト関数を使用すると、たとえば2つのパラメーターを持つ関数をコールバックとして渡すことができ、1つのパラメーターのみを期待できます。
typedef boost::function< void ( int ) > IntExpectingCallback;
void TwoIntFunction( int, int );
{
}
...
IntExpectingCallback callback = boost::bind( TwoIntFunction, 5, _1 );
ただし、これは、すべてのチームがブーストを知っており、ブーストを支持しない限り、コードを読みやすくすることはありません。
他のヒント
はいboost :: functionはこれをうまく行います。それは非常に一般的な使い方です。 boost :: bindを使用して、インスタンスをメンバー関数にバインドする必要があります。
func = boost::bind( &MyClass::CallbackFunc, this);
クラス内からそれを行う方法になります。
「これ」を確認してください消えないか、ブースト機能がどこかのブーストヘッダーの途中でクラッシュします。
上記の回答は素晴らしいですが、質問であなたが言及したことを指摘したいと思います。
&quot;コールバックは単純なvoid()関数になりますが、成長する可能性があり、将来は決してわかりません:)&quot;
これはおそらく、余分な不要な機能の最悪の理由です-「必要な場合に備えて」です。わからない場合-必要以上のことをしないでください。とにかく、特に必要なときまでに、推測が間違っている可能性があります。
一方、すぐに機能が必要になる可能性が非常に高いとわかっている場合は、追加する価値があるかもしれません。
再びMykolaが言ったことを繰り返します-プロジェクトで既にブーストがあり、チームがそれを気に入っている場合、それを使用しますが、それ以外の場合はやりすぎかもしれません。