C 中的重載函數指標
在 C 中,重載函數是具有不同簽章的多個實作的函數。當重載函數傳遞給通用演算法時,指定應使用哪個實作可能具有挑戰性。
考慮以下範例:
class A { void f(char c); void f(int i); void scan(const std::string& s) { std::for_each(s.begin(), s.end(), f); // Overloaded function passed to 'for_each' } };
這裡,我們有一個類別 A有兩個名為 f 的重載成員函數,分別採用 char 和 int 作為參數。 A 的 scan 成員函數嘗試使用 for_each 演算法迭代字串,為每個字元呼叫 f 函數。
問題:
然而,編譯器當傳遞給 std::for_each 時,無法自動確定應使用 f 的哪個實作。這是因為演算法需要一個具有特定簽名的函數指針,而重載的函數簽名無法根據通用函數指針類型來區分。
解:
要指定使用哪個f 重載,我們可以採用以下技術之一:
1.帶函數簽章的靜態轉換:
我們可以使用static_cast()將函數指標轉換為 std::for_each 所需的特定簽章:
// Uses the void f(char c); overload std::for_each(s.begin(), s.end(), static_cast<void (*)(char)>(f)); // Uses the void f(int i); overload std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(f));
2。函數指標宣告:
或者,我們可以使用所需的簽章宣告函數指標並將它們指派給重載函數:
void (*fpc)(char) = &A::f; // Function pointer for void f(char c) std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload void (*fpi)(int) = &A::f; // Function pointer for void f(int i) std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
對於成員函式(可選) :
如果重載函數是成員函數,則mem_fun實用程式可以是使用,或連結的 Dobb 博士的文章中提供的解決方案可用於指定所需的過載。
以上是在 C 中傳遞重載函數指標時如何解決歧義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!