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::cout
test
不是一个函数。它是一个类方法。这有很大的区别。模板试图像调用函数一样调用类方法。这是行不通的。你需要一个类实例来调用类方法。你计划调用其方法的类的实例在哪里?@JeJo是的,我的错误;)编辑
test
不是一个函数。它是一个类方法。这有很大的区别。模板试图调用类方法,就好像它是一个函数一样。这行不通。你需要一个类实例来调用类方法。你计划调用其方法的类的实例在哪里?@JeJo是的,我的错误;)edited成功了!谢谢!注意:我必须从
doSomething
方法中删除
&
,或者最好添加第二个
&
:)抱歉,我在您的代码中遗漏了它。将在中编辑它。干杯!谢谢!注意:我必须从
doSomething
方法中删除
&
),抱歉,我在您中遗漏了它r代码。将在中编辑它。谢谢这是它,但它应该是
doSomething
而不是
test
是的,这是它,但它应该是
doSomething
而不是
test
谢谢!注释部分非常有用!它现在如预期的那样工作:)谢谢!注释部分非常有用!它工作了现在正如所料:)