指定重载函数的指针
在 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中文网其他相关文章!