将重载函数传递给 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)>(&f)); // Uses the void f(int i); overload std::for_each(s.begin(), s.end(), static_cast<void (*)(int)>(&f));
解决方案 2:指针声明
或者,您可以使用隐式指定函数签名的指针声明。这种方法允许编译器自动推断出要调用的正确重载:
// 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
成员函数
如果 f() 函数是成员函数,您将需要使用 mem_fun 或参考 Dobb 博士文章中讨论的解决方案。
以上是将重载函数传递给 std::for_each() 时如何解决歧义?的详细内容。更多信息请关注PHP中文网其他相关文章!