首页 > 后端开发 > C++ > 在 C 中传递重载函数指针时如何解决歧义?

在 C 中传递重载函数指针时如何解决歧义?

Barbara Streisand
发布: 2024-12-24 11:16:11
原创
489 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板