C 中的 std::function 與函數指標:選擇哪一個以及何時選擇?
當涉及在 C 中定義回呼函數時,您有兩個主要選項:C 風格函數指標和 std::function。這種選擇可以顯著影響程式碼的功能和效率。
C 風格函數指標
函數指標已經存在很長時間並且仍然被廣泛使用。它們提供了儲存指向函數的指標的簡單性:
void (*callbackFunc)(int);
但是,它們有一個顯著的限制:
缺乏上下文擷取:函數指標不能保留父函數的上下文(例如,捕獲的變數)。這意味著您無法輕鬆傳遞 lambda 函數或呼叫物件的成員函數作為回呼。
std::function
std::function (在 C 11 中引入)是旨在克服這些限制。它提供了一種類型安全、通用的方式來儲存和傳遞函數:
std::function< void(int) > callbackFunc;
std::function 的優點:
std::function的缺點:
範本參數
第三個選項,特別適合小型函數,是使用可呼叫物件的範本參數t ype:
template <typename CallbackFunction> void myFunction(..., CallbackFunction && callback) { ... callback(...); ... }
模板參數的優點:
模板參數的缺點:
總表
總而言之,下表概述了這些選項之間的主要區別:
Feature | Function Pointer | std::function | Template Parameter |
---|---|---|---|
Context Capture | No | Yes | Yes |
Call Overhead | No | Yes | No |
Inlining | No | No | Yes |
Class Member Storage | Yes | Yes | No |
C 11 Support | Yes | No | Yes |
Readability | Less Readable | More Readable | Somewhat Readable |
大多數情況下,除非您對函數指標或範本參數有特定要求,std::function 是首選,因為它具有靈活性、上下文擷取功能和通用相容性。
以上是std::function 與函式指標:什麼時候應該在 C 中選擇每個函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!