將重載函數傳遞給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)>(&f)); // Uses the void f(int i); overload std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(&f));
解決方案2:指標宣告
或者,您可以使用隱式指定函數簽署的指標宣告。這種方法允許編譯器自動推斷要呼叫的正確重載:
// The compiler will figure out which f to use according to // the function pointer declaration. void (*fpc)(char) = &f; std::for_each(s.begin(), s.end(), fpc); // Uses the void f(char c); overload void (*fpi)(int) = &f; std::for_each(s.begin(), s.end(), fpi); // Uses the void f(int i); overload
成員函數
如果f() 函數是成員函數,您將需要使用mem_fun 或參考Dobb 博士文章中討論的解決方案。
以上是將重載函數傳遞給 std::for_each() 時如何解決歧義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!