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