我有一個正在運行的C++回調函數,由用戶的「鼠標向下」事件觸發。 (IDE是VS2010。)C++回調中局部變量作用域的最佳實踐
每次調用時,我想增加一個簡單的計數變量,該變量對回調的作用域是本地的。簡而言之,做到這一點的「最佳實踐」方式是什麼?
在此先感謝您的任何意見或指示。
我有一個正在運行的C++回調函數,由用戶的「鼠標向下」事件觸發。 (IDE是VS2010。)C++回調中局部變量作用域的最佳實踐
每次調用時,我想增加一個簡單的計數變量,該變量對回調的作用域是本地的。簡而言之,做到這一點的「最佳實踐」方式是什麼?
在此先感謝您的任何意見或指示。
用函子替換你的回調函數 - 它們可以存儲狀態。一個例子函子:
#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
有仿函數的本地副本(注意通過噪聲值),並且希望該副本共享其int
與你有權訪問的函數。還要注意f
必須以價值爲參數,因爲你想支持所有的可調用函數,而不僅僅是函子。
是應該投票你平凡使用示例中的共享指針嗎?一個簡單的int成員變量可能綽綽有餘 – maress
@maress:先閱讀解釋然後再決定。 –
此外,回調的接收者可能是一個需要複製語義的對象(例如,將所有回調存儲在標準庫容器中的東西) – juanchopanza
如果你只想在回調函數中使用這個變量,那麼你需要一個靜態變量。 – Geoffroy
你可以使用一個靜態變量,但要非常小心地使用它的一般情況 – maress