首頁 > 後端開發 > C++ > 在 C 中傳遞重載函數指標時如何解決歧義?

在 C 中傳遞重載函數指標時如何解決歧義?

Barbara Streisand
發布: 2024-12-24 11:16:11
原創
498 人瀏覽過

How to Resolve Ambiguity When Passing Overloaded Function Pointers in C  ?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板