首页 >后端开发 >C++ >将重载函数传递给 std::for_each() 时如何解决歧义?

将重载函数传递给 std::for_each() 时如何解决歧义?

Linda Hamilton
Linda Hamilton原创
2024-12-17 07:00:261002浏览

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