改造设计:仅用捕获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
相关产品推荐
相关产品推荐

