8

ユーザーの「マウスダウン」イベントによってトリガーされる、機能する C++ コールバック関数があります。(IDE は VS2010 です。)

呼び出しごとに、コールバックのスコープに対してローカルな単純なカウント変数をインクリメントしたいと思います。簡単に言えば、これを行うための「ベストプラクティス」の方法は何ですか?

ご意見やご指示をお寄せいただきありがとうございます。

4

1 に答える 1

13

コールバック関数をファンクターに置き換えます-状態を保存できます。ファンクタの例:

#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 をサポートする必要があるため、引数を値で受け取る必要があることに注意してください。

于 2012-05-12T17:09:49.723 に答える