我有一个正常运行的C ++回调函数,由用户'鼠标按下'事件触发。 (IDE是VS2010。)
每次调用时,我都想增加一个对回调范围本地的简单计数变量。简而言之,“最佳实践”的方法是什么?
提前感谢任何意见或指示。
答案 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
必须按值来获取其参数,因为您希望支持所有可调用项,而不仅仅是函数。