簡體   English   中英

C ++函數指針/回調的最佳實踐

[英]Best Practice for C++ Function Pointers/Callbacks

在處理自定義回調或函數指針時,我正在尋找最佳實踐方面的一些指導。

我現在有兩個主要用例。

  1. 我的班級里面有一個阻塞循環,永遠循環。 我希望外部用戶能夠指定在該循環的每次迭代中調用的函數。

防爆。

myClass.setLoopFunction(doStuff); 

doStuff是位於其他地方的函數,它將在循環的每次迭代中被調用。

  1. 我從一個可以對應多個值的函數中獲取一個int。 我想動態地將函數映射到這些值,所以我可以在int上查找,然后調用相應的函數。

防爆。

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來提供它。

  1. 如果你的回調最終回調到GUI訪問代碼,你可能需要將控制權分派給GUI線程( Control.Invoke()Control.BeginInvoke在.NET的WinForms中執行此操作)。 這可能會導致死鎖,所以要小心。
  2. 作為前一點的概括,請記住在回調調用期間,循環函數將無法處理請求。 所以在回調函數中,盡可能少地工作,或者如果你需要做cpu密集的東西,則產生另一個線程。 並盡量避免調用阻塞函數。
  3. 不再忘記在不再需要時取消注冊回調( myClass.setLoopFunction(NULL) ),並在從循環中調用它之前檢查它是否已設置。 這是可選的,我只是為了提供更順暢的清理。 如果循環需要高性能,則可以跳過此步驟。
  4. 什么@ K-ballo說。 關於@ mah的建議,可以使用界面或模板來完成

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM