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

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

Linda Hamilton
发布: 2024-12-17 07:00:26
原创
1001 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板