2016-08-02 11 views
1

操作が完了した(または失敗した)ケースのコールバックパラメータを追加していますか?例:操作完了コールバックプログラミングの実施

ここ
template <typename F> 
void load(::std::string const& path, F&& f) 
{ 
    // after a long load 
    ::std::invoke(f, path); 
} 

fは、別のスレッドのコンテキストで呼び出されるかもしれません。私の質問は、プログラム内に1発の信号/スロットのペアを持つことが価値があるかどうかを熟考することから来ています。つまり、1回だけ呼び出されるスロットです。それ以外の場合は、接続して信号を切断する必要がありますが、これは面倒であると考えられます。その根拠は、ブール値などの戻り値では結果を待つ必要があるのに対して、コールバックでは必要ないということです。

+0

構文が奇妙に思えます。 Fさんは何をすべきか?どうして 'std :: function '? –

+0

':: std :: invoke'のような呼び出し可能なオブジェクトは、 – user1095108

+0

と表示されます。オブザーバパターンを使用するとメンテナンス性が向上すると思います。 – adrianN

答えて

2

一般的に悪いことではありません。これは、Boost.Asioに見られるように、非同期プログラミングのかなり基本的な部分です。

Boost.Asioは、C++ 03であることを除いて、すべてのコールバック関数でほぼ同じ構文を使用するため、invokeは使用できません。例はasync_readです。呼び出し元は、コールバック関数が適切に取り込まれる引数としてerror_codeを取るという要件(テンプレートによって強制される)を条件として、ソケットから読み込んでコールバック関数を呼び出すようにAsioに指示します。

関連する問題