我有两个带有方法的类:
void ClassA::myFunction(void (*fn)() = NULL);
void ClassB::run();
还有一些代码
ClassA A();
ClassB B();
void runBfn()
{
B.run();
}
void setup()
{
A.myFunction( runBFn ); // works
A.myFunction( [](void){B.run();} ); // works
A.myFunction( B.run ); // not works
}
为什么
A.myFunction( B.run );
不工作?我可以在不声明单独的函数(匿名与否)的情况下实现它吗?
myFunction()
接受一个指向独立函数的指针,而不是指向类方法的指针。非捕获 lambda 可隐式转换为函数指针。
您需要:
添加 myFunction()
的重载采用方法指针:
B类;
类A类{
上市:
void myFunction(void (*fn)());
void myFunction(B &b, void (B::*fn)());
};
类B类{
上市:
无效运行();
};
void ClassA::myFunction(void (*fn)()) {
fn();
}
void ClassA::myFunction(B &b, void (B::*fn)()) {
(b.*fn)();
}
无效 ClassB::run() {
...
}
A类;
B类B;
无效 runBfn() { B.run(); }
无效设置(){
A.myFunction(runBFn);
A.myFunction( [](){ B.run(); } );
A.myFunction(B, &ClassB::run);
}
添加 myFunction()
的重载它采用 ClassB
的接口(interface)实现:
类可运行{
上市:
虚空运行()= 0;
};
类A类{
上市:
void myFunction(void (*fn)());
void myFunction(Runnable &r);
};
类ClassB:公共(public)可运行{
上市:
无效运行()覆盖;
};
void ClassA::myFunction(void (*fn)()) {
fn();
}
void ClassA::myFunction(Runnable &r) {
r.run();
}
无效 ClassB::run() {
...
}
A类;
B类B;
无效 runBfn() { B.run(); }
无效设置(){
A.myFunction(runBFn);
A.myFunction( [](){ B.run(); } );
A.myFunction(B);
}
制作 myFunction()
拍下std::function
而不是函数指针:
#include <功能>
类A类{
上市:
void myFunction(std::function
fn);
};
类B类{
上市:
无效运行();
};
void ClassA::myFunction(std::function
fn) {
fn();
}
无效 ClassB::run() {
...
}
A类;
B类B;
无效 runBfn() { B.run(); }
无效设置(){
A.myFunction(runBFn);
A.myFunction( [](){ B.run(); } );
auto fn = std::bind(&ClassB::run, &B);
A.myFunction(fn);
}
制作 myFunction()
可以使用任何兼容的可调用函数/对象调用的模板函数:
类A类{
上市:
模板<类型名可调用>
无效 myFunction(可调用 fn){
fn();
}
};
类B类{
上市:
无效运行();
};
无效 ClassB::run() {
...
}
A类;
B类B;
无效 runBfn() { B.run(); }
无效设置(){
A.myFunction(runBFn);
A.myFunction( [](){ B.run(); } );
auto fn = std::bind(&ClassB::run, &B);
A.myFunction(fn);
}
我是一名优秀的程序员,十分优秀!