首页 > 后端开发 > C++ > 如何在 C 中指定指向重载函数的指针?

如何在 C 中指定指向重载函数的指针?

Barbara Streisand
发布: 2024-12-30 05:03:08
原创
914 人浏览过

How Can I Specify a Pointer to an Overloaded Function in C  ?

指定重载函数的指针

在 C 领域,遇到同名但不同名称的重载函数并不罕见。它们的输入参数不同。当尝试将此类函数作为参数传递给 std::for_each() 等通用算法时,这提出了挑战。

类中的嵌套重载函数

考虑以下内容例如,类中发生重载:

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

    void scan(const std::string& s) {
        std::for_each(s.begin(), s.end(), f);
    }
};
登录后复制

这里,使用字符串调用 scan() 方法让编译器不确定要使用 f 的哪个实现。默认情况下,f() 将接受一个字符作为参数。但是,用户可能打算使用接受整数的重载。

显式指针赋值

为了解决这种歧义,可以显式指定所需的重载使用 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));
登录后复制

通过将函数指针转换为适当的类型,您可以可以显式向编译器指示应调用哪个重载。

使用函数指针的替代方法

另一种方法是显式声明函数指针:

// 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
登录后复制

通过创建具有特定签名的函数指针,编译器可以自动确定正确的重载use.

成员函数处理

如果重载函数是成员函数,则需要采用不同的方法。考虑使用 mem_fun 模板或参考其他资源,例如提供的答案中链接的 Dobb 博士的文章。

以上是如何在 C 中指定指向重载函数的指针?的详细内容。更多信息请关注PHP中文网其他相关文章!

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