C ++回调中局部变量范围的最佳实践

时间:2012-05-12 17:03:42

标签: c++

我有一个正常运行的C ++回调函数,由用户'鼠标按下'事件触发。 (IDE是VS2010。)

每次调用时,我都想增加一个对回调范围本地的简单计数变量。简而言之,“最佳实践”的方法是什么?

提前感谢任何意见或指示。

1 个答案:

答案 0 :(得分: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;
}

请注意在仿函数中使用shared_ptr - 这是因为f具有仿函数的本地副本(请注意按值传递),并且您希望该副本共享其{ {1}}您可以访问的仿函数。另请注意,int必须按值来获取其参数,因为您希望支持所有可调用项,而不仅仅是函数。