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必须按值获取其参数,因为您希望支持所有可调用对象,而不仅仅是函子。

于 2012-05-12T17:09:49.723 回答