C++ 如何将派生类中的成员函数作为回调传递?
我有一个简单的类C++ 如何将派生类中的成员函数作为回调传递?,c++,c++11,callback,C++,C++11,Callback,我有一个简单的类X class X { public: template<typename T> void doSomething(T &completion) { std::cout << completion(10) << std::endl; } }; 我想向doSomething方法传递类B(或从a派生的任何其他类)的成员方法,但它不起作用:/ 如何将派生类中的成员函数作为回调传递 你的问题与B是一个子
X
class X {
public:
template<typename T>
void doSomething(T &completion) {
std::cout << completion(10) << std::endl;
}
};
我想向doSomething
方法传递类B
(或从a
派生的任何其他类)的成员方法,但它不起作用:/
如何将派生类中的成员函数作为回调传递
你的问题与B
是一个子类无关。您的问题是没有将非静态成员函数test()
绑定到其实例
您可以通过以下两种方式轻松解决此问题:
别忘了把#包括在内
或者使用lambda将此
放在以下位置来包装调用:
注意:确保将doSomething()
的参数更改为右值引用,这样它就可以在临时对象和其他对象中正确地接受所有回调函数。应该是这样的:
template<typename T>
void doSomething(T&& completion)
c->doSomething([this] (int x) { return this->test(x); });
模板
无效剂量测定(T&完成)
如何将派生类中的成员函数作为回调传递
你的问题与B
是一个子类无关。您的问题是没有将非静态成员函数test()
绑定到其实例
您可以通过以下两种方式轻松解决此问题:
别忘了把#包括在内
或者使用lambda将此
放在以下位置来包装调用:
注意:确保将doSomething()
的参数更改为右值引用,这样它就可以在临时对象和其他对象中正确地接受所有回调函数。应该是这样的:
template<typename T>
void doSomething(T&& completion)
c->doSomething([this] (int x) { return this->test(x); });
模板
无效剂量测定(T&完成)
你的意思是c->doSomething([this](intx){返回this->test(x);})代码>?你的意思是c->doSomething([this](intx){返回这个->测试(x);})代码>?使B::test
成为一种静态方法,它将按以下方式工作:
static int test(int x) {
return x * x;
}
// ...
c->doSomething(&B::test);
这是因为静态方法不需要隐式实例(This
指针)
如果B::test
必须是常规方法,则必须使用捕获lambda传递实例,如下所示:
template<typename T>
void doSomething(T&& completion)
c->doSomething([this] (int x) { return this->test(x); });
注意:在编译此代码时,我需要更改您对doSomething
的定义,使和关闭T
:
template<typename T>
void doSomething(T completion) {
std::cout << completion(10) << std::endl;
}
模板
无效剂量测定(T完成){
std::cout使B::test
成为一种静态方法,它将按以下方式工作:
static int test(int x) {
return x * x;
}
// ...
c->doSomething(&B::test);
这是因为静态方法不需要隐式实例(This
指针)
如果B::test
必须是常规方法,则必须使用捕获lambda传递实例,如下所示:
template<typename T>
void doSomething(T&& completion)
c->doSomething([this] (int x) { return this->test(x); });
注意:在编译此代码时,我需要更改您对doSomething
的定义,使和关闭T
:
template<typename T>
void doSomething(T completion) {
std::cout << completion(10) << std::endl;
}
模板
无效剂量测定(T完成){
std::couttest
不是一个函数。它是一个类方法。这有很大的区别。模板试图像调用函数一样调用类方法。这是行不通的。你需要一个类实例来调用类方法。你计划调用其方法的类的实例在哪里?@JeJo是的,我的错误;)编辑test
不是一个函数。它是一个类方法。这有很大的区别。模板试图调用类方法,就好像它是一个函数一样。这行不通。你需要一个类实例来调用类方法。你计划调用其方法的类的实例在哪里?@JeJo是的,我的错误;)edited成功了!谢谢!注意:我必须从doSomething
方法中删除&
,或者最好添加第二个&
:)抱歉,我在您的代码中遗漏了它。将在中编辑它。干杯!谢谢!注意:我必须从doSomething
方法中删除&
),抱歉,我在您中遗漏了它r代码。将在中编辑它。谢谢这是它,但它应该是doSomething
而不是test
是的,这是它,但它应该是doSomething
而不是test
谢谢!注释部分非常有用!它现在如预期的那样工作:)谢谢!注释部分非常有用!它工作了现在正如所料:)