ユーザーの「マウスダウン」イベントによってトリガーされる、機能する C++ コールバック関数があります。(IDE は VS2010 です。)
呼び出しごとに、コールバックのスコープに対してローカルな単純なカウント変数をインクリメントしたいと思います。簡単に言えば、これを行うための「ベストプラクティス」の方法は何ですか?
ご意見やご指示をお寄せいただきありがとうございます。
ユーザーの「マウスダウン」イベントによってトリガーされる、機能する C++ コールバック関数があります。(IDE は VS2010 です。)
呼び出しごとに、コールバックのスコープに対してローカルな単純なカウント変数をインクリメントしたいと思います。簡単に言えば、これを行うための「ベストプラクティス」の方法は何ですか?
ご意見やご指示をお寄せいただきありがとうございます。
コールバック関数をファンクターに置き換えます-状態を保存できます。ファンクタの例:
#include <iostream>
#include <memory>
class Functor
{
private:
std::shared_ptr<int> m_count;
public:
Functor()
: m_count(new int(0))
{}
void operator()()
{
++(*m_count);
// do other stuff...
}
int count() const
{
return *m_count;
}
};
template <typename F>
void f(F callback)
{
// do stuff
callback();
// do other stuff
}
int main()
{
Functor callback;
f(callback);
f(callback);
std::cout << callback.count(); // prints 2
return 0;
}
ファンクター内で a を使用していることに注意してください。shared_ptr
これは、ファンf
クターのローカル コピーがあり (値渡しに注意)、そのコピーを、int
アクセスできるファンクターと共有するためです。f
また、ファンクターだけでなく、すべての callable をサポートする必要があるため、引数を値で受け取る必要があることに注意してください。