You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

改造设计:仅用捕获Lambda实现静态分配通用回调机制问询

基于捕获Lambda实现无动态分配的通用回调机制改造

需求说明

  • 统一调用接口:已实现void call(),这类回调可统一存入数组
  • 统一注册回调:待实现,需满足以下限制:
    • 必须静态分配,禁止使用new、std::bind或std::tuple
    • 仅能通过捕获Lambda及std::function替代方案存储回调
    • 目标是实现无需模板化的统一类型EventHandler,可直接存入std::array<Msg_t>

现有代码框架

class Function{
public:
    virtual void call()=0;
};

template<typename T>
class TemplatedFunction : public Function{
public:
    int (T::*m_fkt)();
    T* m_obj;
 
    TemplatedFunction(T* obj, int (T::*fkt)()):m_fkt(fkt),m_obj(obj){}

    // 可在此处设置捕获回调参数的Lambda:[&](){ f(Args...args) },通过call()调用,f为回调对应的std::function
    void call(){
        (m_obj->*m_fkt)();
    }
};

现有注册方案(不符合要求,使用了new)

class EventHandler{
public:
    Function* m_func=nullptr;

    template<class T> 
    void SetCallbackFunction(T* obj, void (T::*mem_fkt)()){
        if(m_func != nullptr)
            delete m_func;
        m_func = new TemplatedFunction<T>(obj,mem_fkt); // 此处禁止使用new
    }

    void TestCallback(){
        if(m_func != nullptr)
            m_func->call();
    }

    ~EventHandler(){
        if(m_func != nullptr)
            delete m_func;
    }
};

期望最终使用方式

// 静态分配的回调,具备统一的void call()接口
// Function* m_func_to_run_callback1 = TemplatedFunction<> Callback1();
// Function* m_func_to_run_callback2 = TemplatedFunction<> Callback2();

int main() 
{
    EventHandler eh, eh1;
    Foo foo; // 自定义类
    Foo2 foo2; // 另一个自定义类
    eh.SetCallbackFunction(&foo, &Foo::bar, m_func_to_run_callback1 ) ;
    eh1.SetCallbackFunction(&foo2, &Foo2::bar2, m_func_to_run_callback1) ;
    return 0;
}

初步改进设想

考虑给Function基类添加set(void*)虚函数来支持静态分配的回调设置,但方案仍需完善:

class Function{
public:
    virtual void call()=0;
    virtual void set(void*) = 0; // void* 指向回调函数
};

内容的提问来源于stack exchange,提问作者user user

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:21:58