我想将重载的函数传递给std::for_each()
算法。例如,
class A {
void f(char c);
void f(int i);
void scan(const std::string& s) {
std::for_each(s.begin(), s.end(), f);
}
};
我希望编译器能够解析f()
迭代器类型。显然,它(gcc 4.1.2)没有做到这一点。那么,我如何指定f()
我想要?
发布于 2021-03-22 12:46:00
你可以用static_cast<>()
指定哪个f
根据函数指针类型所隐含的函数签名使用:
// 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
如果f
是一个成员函数,那么您需要使用mem_fun
,或者对于您的情况,使用这篇杜布博士的文章中给出的解决方案。
发布于 2021-03-22 13:53:49
救援羔羊!(注:C++11必需)
std::for_each(s.begin(), s.end(), [&](char a){ return f(a); });
或者对lambda参数使用解密类型:
std::for_each(s.begin(), s.end(), [&](decltype(*s.begin()) a){ return f(a); });
多态lambdas(C++14):
std::for_each(s.begin(), s.end(), [&](auto a){ return f(a); });
或通过删除重载消除歧义(仅适用于空闲函数):
void f_c(char i)
{
return f(i);
}
void scan(const std::string& s)
{
std::for_each(s.begin(), s.end(), f_c);
}
https://stackoverflow.com/questions/-100001417
复制相似问题