首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何指定指向重载函数的指针?

如何指定指向重载函数的指针?
EN

Stack Overflow用户
提问于 2021-03-22 04:31:36
回答 2查看 0关注 0票数 0

我想将重载的函数传递给std::for_each()算法。例如,

代码语言:txt
复制
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()我想要?

EN

回答 2

Stack Overflow用户

发布于 2021-03-22 12:46:00

你可以用static_cast<>()指定哪个f根据函数指针类型所隐含的函数签名使用:

代码语言:txt
复制
// 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)); 

或者,你也可以这样做:

代码语言:txt
复制
// 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,或者对于您的情况,使用这篇杜布博士的文章中给出的解决方案

票数 0
EN

Stack Overflow用户

发布于 2021-03-22 13:53:49

救援羔羊!(注:C++11必需)

代码语言:txt
复制
std::for_each(s.begin(), s.end(), [&](char a){ return f(a); });

或者对lambda参数使用解密类型:

代码语言:txt
复制
std::for_each(s.begin(), s.end(), [&](decltype(*s.begin()) a){ return f(a); });

多态lambdas(C++14):

代码语言:txt
复制
std::for_each(s.begin(), s.end(), [&](auto a){ return f(a); });

或通过删除重载消除歧义(仅适用于空闲函数):

代码语言:txt
复制
void f_c(char i)
{
    return f(i);
}

void scan(const std::string& s)
{
    std::for_each(s.begin(), s.end(), f_c);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100001417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档