如何调用传递的函数(函数 ptr 作为参数传递给函数)
How to call function passed (function ptr passed as argument to function)
在下面的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(); }
相关文章:
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 视觉 C++编译器在计算其参数之前是否允许将函数 ptr 存储在寄存器中?
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 通过成员函数将唯一 ptr 的向量附加到另一个向量
- 如何将函数 ptr 分配给函数 ptrs 数组(Arduino C++)
- 带智能ptr的Pimpl-为什么需要构造函数/析构函数
- 如何将shared_ptr传递给裸 ptr 函数
- 将 lamba 隐式转换为函数 ptr 以创建类
- c++在没有虚拟析构函数的多态性中共享ptr
- 如何调用传递的函数(函数 ptr 作为参数传递给函数)
- OpenCL enqueueWriteImage no const void* ptr 在包装器中C++但在 C 函数中
- 正在从DLL获取函数PTR
- 从虚拟成员函数ptr中进行类型推导(bug?)
- 为什么这个显式析构函数会导致共享ptr中的内存损坏
- 如何访问受保护的基类函数,从派生类通过基类ptr
- openv Ptr类.指针对象在调用函数后被删除
- 函数PTR转换为带模板参数的函数
- 删除从函数返回的唯一ptr
- 具有基类唯一ptr的类的复制构造函数