调用从另一个类传递的回调

Posted

技术标签:

【中文标题】调用从另一个类传递的回调【英文标题】:Calling a callback passed from another class 【发布时间】:2021-10-17 13:59:30 【问题描述】:

我想在另一个类 (X) 中注册一个类 (Y) 的回调处理程序(方法)。由于可能的堆分配,我不能使用 std::function 并且我必须有权访问注册处理程序的类的成员。我也想避免静态函数。 我想出了一些工作方法,但一直坚持调用回调:

template<class T>
using clbkType = void(T::*)(void);

template<class T>
class X

public:

    void registerClbck(clbkType<T> clbk) 
        callback = clbk;
    

    void call() 
        callback(); // ERROR C2064: term does not evaluate to a function taking 0 arguments.
        //(((X<T>*)this)->X<T>::callback)(); // same error

    
private:
    clbkType<T> callback;
;

class Y

public:

    Y() 
        x.registerClbck(&Y::handler);
    

    // just for a test: fire a callback in class X
    void fire() 
        x.call();
    

    int getA()  return a; 
private:
    int a 0 ;
    X<Y> x;

    void handler() 
        a = 5;
    
;

int main()

    Y y;
    y.fire();
    return y.getA();

代码链接:https://godbolt.org/z/PhY41xsWE

PS。我不确定这是否是一个安全的解决方案,所以请对此发表评论。

谢谢!

【问题讨论】:

您的描述未提及终生担忧。 @Yakk-AdamNevraumont:X 类的生存时间与 Y 类一样长。我想如果 Y 不再存在并且 X 调用它的回调就会失败,但是在这里,X 对象是Y 的成员,所以我想没关系。 【参考方案1】:

成员函数指针需要特定的类对象才能调用,所以需要这样做:

template<class T>
class X

public:
    // ...
    void call(T& obj) 
      (obj.*callback)();
    
    // ...
;

class Y

public:
    // just for a test: fire a callback in class X
    void fire() 
      x.call(*this);
    
    // ...  
;

Demo.

【讨论】:

【参考方案2】:

成员函数指针需要一个实例才能被调用。

如果要绑定实例,这里有一种可能的实现方式。

template<typename T>
struct member_callback 
    T* instance;
    void(T::*callback)();
    void operator()()(instance->*callback)();
;

template<typename T>
struct X
    void registerClbck(member_callback<T> clbk)  callback = clbk; 
    void call()  callback(); 
    member_callback<T> callback;
;

struct Y
public:
    Y()  x.registerClbck(this,&Y::handler); 
    void fire()  x.call(); 
    int getA()  return a; 
private:
    int a 0 ;
    X<Y> x;
    void handler() a = 5; 
;

int main()

    Y y;
    y.fire();
    return y.getA();

【讨论】:

以上是关于调用从另一个类传递的回调的主要内容,如果未能解决你的问题,请参考以下文章

python 怎么把一个类传递给JAVA,然后Java调用python类的回调函数

如何使用express在回调函数之间传递值? [复制]

如何用简单的英语解释回调?它们与从另一个函数调用一个函数有何不同?

Cocoa:从另一个类调用 App Delegate 方法

类内定义线程的回调函数问题

如何调用 shell 脚本并从另一个 shell 脚本传递参数