首頁 >後端開發 >C++ >將重載函數傳遞給 std::for_each() 時如何解決歧義?

將重載函數傳遞給 std::for_each() 時如何解決歧義?

Linda Hamilton
Linda Hamilton原創
2024-12-17 07:00:261006瀏覽

How to Resolve Ambiguity When Passing Overloaded Functions to std::for_each()?

將重載函數傳遞給std::for_each()

在C 中使用重載函數時,您可能會遇到需要以下情況:將這些重載之一傳遞給std::for_each() 等演算法。但是,編譯器可能無法根據迭代器的類型自動確定要呼叫的正確重載。

範例:

考慮以下具有兩個重載f 的類別() 函數:

class A {
    void f(char c);
    void f(int i);

    void scan(const std::string& s) {
        std::for_each(s.begin(), s.end(), f); // Error!
    }
};

由於對f() 的呼叫不明確而出現編譯器錯誤。要解決此問題,您需要明確指定要使用哪個重載。

解決方案1:使用static_cast()

實現此目的的一種方法是使用static_cast() 將函數指標轉換為適當的簽章,如圖下方:

// Uses the void f(char c); overload
std::for_each(s.begin(), s.end(), static_cast<void (*)(char)>(&amp;f));
// Uses the void f(int i); overload
std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(&amp;f));

解決方案2:指標宣告

或者,您可以使用隱式指定函數簽署的指標宣告。這種方法允許編譯器自動推斷要呼叫的正確重載:

// The compiler will figure out which f to use according to
// the function pointer declaration.
void (*fpc)(char) = &amp;f;
std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload
void (*fpi)(int) = &amp;f;
std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload

成員函數

如果f() 函數是成員函數,您將需要使用mem_fun 或參考Dobb 博士文章中討論的解決方案。

以上是將重載函數傳遞給 std::for_each() 時如何解決歧義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn