如何将成员函数作为函数指针传递?

时间:2010-08-04 02:33:23

标签: c++

我想在工人类中添加记录器功能, 如何将成员函数作为函数指针传递? 使用mem_fun?

这是代码示例:

class Work{
public:
    void (*logger) (const string &s);
    void do_sth(){if (logger) logger("on log")};
};

classs P{
public:
    void log(const string &s)(cout << s);
};

int main(){
    Work w;
    P p;
    w.logger = &p.log;
    w.do_sth();
}

编辑:

我不想使用void(P :: * xxx)()因为它坚持P类...

我知道C ++隐藏了,真正的日志功能是:void log(P&amp; p,const string&amp; s),

真正的项目是这样的:

我创建了一个CDialog,并且有一个日志功能,它将日志字符串复制到CEdit。

所以我需要将这个日志函数传递给一个Worker类,这个类做一些串口作业,

我需要记录并显示发送和回收的数据......

3 个答案:

答案 0 :(得分:4)

您可以使用std::functionstd::bind

完成此操作
#include <functional>
#include <iostream>
#include <string>

class Work {
public:
    std::function<void(const std::string&)> logger;
    void do_sth() { logger("on log"); }
};

class P {
public:
    void log(const std::string& s) { std::cout << s; }
};

int main() {
    Work w;
    P p;
    w.logger = std::bind(&P::log, p, std::placeholders::_1);
    w.do_sth();
}

请注意,functionbind可能不在您的实施标准库中;你也可以get them from the Boost libraries

答案 1 :(得分:1)

唯一的方法是作为静态函数。不幸的是,静态函数不依赖于单个对象,而是属于该类的全局函数。如果你很幸运,带有函数指针的函数也将带有一个void *,你可以用它来绑回原始对象 - 你的静态函数可以将它强制转换回一个对象指针并调用该对象上的另一个函数做实际的工作。

答案 2 :(得分:0)

这需要关闭,C ++并不完全具有。你可以制作仿函数并使用模板,但是你必须走开路。