如何将派生类中的成员函数作为回调传递?
How can I pass a member function from a derived class as a callback?
我有一个简单的类X
class X {
public:
template<typename T>
void doSomething(T &completion) {
std::cout << completion(10) << std::endl;
}
};
和班级A
和B
class A {
public:
// some code
X* c;
};
class B : public A {
public:
int test(int x) {
return x * x;
}
void execute() {
auto lambda = [] (int x) { cout << x * 50 << endl; return x * 100; };
c->doSomething(lambda); // works
c->doSomething(&B::test); // does not work
}
};
我想将类B
(或从A
派生的任何其他类(的成员方法传递给doSomething
方法,但它不起作用:/
如何将派生类中的成员函数作为回调传递?
你的问题与B
是儿童班无关。您的问题是您没有将非静态成员函数test()
绑定到其实例。
您可以通过使用std::bind
返回函子来轻松解决此问题:
c->doSomething(std::bind(&B::test, this, std::placeholders::_1));
不要忘记#include <functional>
,
或者使用 lambda 通过将this
放入lambda捕获中来包装调用:
c->doSomething([this](int x){ return this->test(x); });
注意:确保将doSomething()
的参数更改为右值引用,以便它可以在临时对象和其他对象中正确获取所有这些回调优点。应如下所示:
template<typename T>
void doSomething(T&& completion)
使B::test
成为静态方法,它将按编写方式工作:
static int test(int x) {
return x * x;
}
// ...
c->doSomething(&B::test);
这是因为静态方法不需要隐式实例(this
指针(。
如果B::test
必须是常规方法,则必须使用捕获 lambda 传递实例,如下所示:
c->doSomething([this] (int x) { return this->test(x); });
注意:在编译此代码时,我需要更改您对doSomething
的定义以关闭T
&
:
template<typename T>
void doSomething(T completion) {
std::cout << completion(10) << std::endl;
}
这可以防止对函数指针类型放置 l 值或非常量约束,这可能会阻止编译器创建临时 lambda 函数。
你是说c->doSomething([this](int x) { return this->test(x); });
吗?
相关文章:
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- 从不同的 cpp 调用回调函数会导致bad_function_call
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- C 回调函数在对象 pascal 上崩溃
- 类 Referention 中C++回调函数引用非静态函数
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 动态链接库中C++回调函数
- 我想制作设置鼠标回调函数,以便在仍然按下鼠标左键时连续传递坐标
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 我可以使用谷歌 v8 在回调函数中获取 JavaScript 函数C++源文本吗?
- 重写另一个方法 [C++] 使用的超类回调函数
- 是否可以影响 C++ 中回调函数的局部变量?
- C++ Qt5 中带有 pigpio 库的回调函数
- 在定时器回调函数中使用 Sleep() 会导致C++出现问题吗?
- C++在赋值或回调函数时重载模板
- 如何用不同的参数类型和数字回调函数
- 如何为Python Swigged C++对象创建和分配回调函数
- 用回调函数替换C++正则表达式
- C++带有回调函数的模板类