ファンクター、つまり を定義するクラスのオブジェクトを使用する場合、operator()
それを関数と同じ方法で使用できます (たとえば、現在使用しているコールバック関数の代わりに) が、クラスのデータ メンバーでは次のことができます。状態情報を保存します。これに沿った何か:
class CallbackObject {
int _state_information;
public:
CallbackObject():_state_information(0) {}
void operator()(int some_data_to_process) {
/* ..process data.. */
++_state_information; // Update internal state
}
};
次に、このクラスのオブジェクトをコールバック関数と同じ方法で使用できます。
ただし、C++11 を使用できる場合は、ラムダのキャプチャを使用して、同様の効果を達成する特に便利な方法があります。
#include <iostream>
/* This is our "backend" that calls the callback
function: */
template <typename Callback>
void process(int data, Callback callback) {
callback(data);
}
int main()
{
/* State information: */
int num_calls = 0;
/* Here we define the callback function as a lambda: */
auto callback = [&num_calls](int data) { ++num_calls; };
/* Have it called a few times: */
for (int i = 0 ; i < 10 ; ++i)
process(i,callback);
std::cout << "Callback was called " << num_calls << " times." << std::endl;
return 0;
}
関数内のcallback
変数にはmain
、ラムダ関数が格納されます。[&num_calls]
整数変数num_calls
が参照としてキャプチャされることを意味するため、ラムダが呼び出されたときにその値に加えられた変更は、元の変数に直接影響しますnum_calls
。num_calls
したがって、(もちろん、より複雑な型または複数の変数の場合もあります) のようなキャプチャされた参照を使用して、状態情報を保存および更新できます。