如何调用传递的函数(函数 ptr 作为参数传递给函数)

How to call function passed (function ptr passed as argument to function)

本文关键字:函数 ptr 参数传递 何调用 调用      更新时间:2023-10-16

在下面的command_rq行中,它无法编译,在这种情况下如何调用该函数? 我需要如何更改函数才能使其正常工作?

#include <iostream>
using namespace std;
struct Command {
    bool RequestA() { cout << "RequestAn"; return true; }
    bool RequestB() { cout << "RequestBn"; return true; }
    bool RequestC() { cout << "RequestCn"; return true; }
};
typedef bool (Command::*Request)();
class handler {
public:
    handler(Command* cmd) : command_(cmd) { }
    // *** How to now call specific function passed?
    void doX(Request rq) { command_->rq(); }
    void doA() { doX(&Command::RequestA); }
    void doB() { doX(&Command::RequestA); }
    void doC() { doX(&Command::RequestA); }
private:
    Command* command_;
};
int main() {
    Command* pCmd = new Command;
    handler h(pCmd);
    h.doA();
}

正确的 sytax 是这样的:

(command_->*rq)();

但是,您的代码无法编译,因为这些行是非法的:

void doA() { doX(command_->RequestA); }
void doB() { doX(command_->RequestA); }
void doC() { doX(command_->RequestA); }

指向成员函数的指针具有隐式 this 参数,不能在调用中传递它。

您必须更改函数以获取指向 Command 对象的指针,以便传递的函数指针具有可以"调用"的对象:

void doX(Request rq,Command* cmd) {
    (cmd->*rq)();
}
void doA() { doX(&Command::RequestA, command_); }
void doB() { doX(&Command::RequestB, command_); }
void doC() { doX(&Command::RequestC, command_); }

您还可以通过将函数声明为静态并创建指向 bool* 函数的简单指针来绕过它。

class Command
{
public:
    static bool RequestA() { cout << "RequestAn"; return true; }
    static bool RequestB() { cout << "RequestBn"; return true; }
    static bool RequestC() { cout << "RequestCn"; return true; }
};
typedef bool (*Request)();
class handler
{
public:
    handler(Command* cmd) : command_(cmd) { }
    // *** How to now call specific function passed?
    void doX(Request rq) {
                            (rq)();
                        }
    void doA() { doX(command_->RequestA);}
    void doB() { doX(command_->RequestB); }
    void doC() { doX(command_->RequestC); }
private:
    Command* command_;
};

int main(){
    Command* pCmd = new Command;
    handler h(pCmd);
    h.doA();
    h.doB();
    h.doC();
}

为什么不简单地:

void doA() { command_->RequestA(); }