[英]Best Practice for C++ Function Pointers/Callbacks
在處理自定義回調或函數指針時,我正在尋找最佳實踐方面的一些指導。
我現在有兩個主要用例。
防爆。
myClass.setLoopFunction(doStuff);
doStuff是位於其他地方的函數,它將在循環的每次迭代中被調用。
防爆。
myFunctionMap[passedInt]();
其中int充當查找正確函數的鍵。
我知道我的語法可能已關閉,我將需要使用std :: map並傳遞指針等,但任何幫助,指導或陷阱都將不勝感激。
謝謝!
編輯:
我現在將以下聲明為公共變量:
class Window {
public:
//The processing function can be from any class and takes in no arguments and returns void
template<class T>
std::function<void(T*, void)> processingFunction;
};
我想要的功能是任何類都可以傳入一個接受0參數並返回void的函數,我會將其設置為我的處理函數。 在while循環中,我將執行該processingFunction,它將調用該原始類的成員函數。
while(true) {
if (exitCondition == false) {
//Execute processing function
processingFunction();
}
else {
break;
}
}
我覺得我完全錯過了模板,std :: function和/或std :: bind的東西。 然后,這是一個很好的四個小時的互聯網搜索,所以也許我只需要睡在它上面。
我建議你使用std::function< void() >
而不是指針。 請注意,這是標准庫的TR1添加,您可以使用它的Boost實現來處理舊的實現。 它的好處是它采用任何類型的函數不帶參數並返回與void
兼容的東西(即:返回任何東西)。 您可以將它與std::bind
以獲得更大的靈活性。
也就是說,你仍然需要一個std::map< int, std::function< void() > >
(或者如果你的索引是順序的普通的std::vector
)來從索引映射到函數。
我建議您定義回調以包含void *
參數,調用者在安裝回調時指定該參數。 這允許調用者將任意數據傳遞到它們的回調中,這通常需要為該函數提供上下文。 不需要此參數的調用者可以使用NULL來提供它。
Control.Invoke()
和Control.BeginInvoke
在.NET的WinForms中執行此操作)。 這可能會導致死鎖,所以要小心。 myClass.setLoopFunction(NULL)
),並在從循環中調用它之前檢查它是否已設置。 這是可選的,我只是為了提供更順暢的清理。 如果循環需要高性能,則可以跳過此步驟。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.