如何将C++成员函数传入仿函数参数?(TRI DDS场景)
嘿,我来帮你搞定这个TRI DDS的函数调用问题!咱一步步拆解:
为啥直接传成员函数do_stuff()不行?
类的成员函数和普通全局函数/静态函数不一样——它天生带着一个隐藏的this指针参数,用来指向调用它的类实例。而DDS的目标函数期待的是不需要额外上下文的可调用对象(比如普通函数指针、无捕获的lambda,或者绑定了上下文的仿函数),直接传&MyClass::do_stuff的话,类型完全不匹配,自然会失败。
方法1:用std::bind绑定类实例
这是最直接的解决方式,通过std::bind把成员函数和具体的类实例绑定在一起,转换成符合要求的可调用对象:
// 假设你的类实例是my_obj,DDS的目标函数叫register_handler auto bound_func = std::bind(&MyClass::do_stuff, &my_obj, std::placeholders::_1); // 然后把bound_func传给DDS的函数 dds_target_function(bound_func);
&my_obj就是你要指定的类实例指针(如果是在类内部设置回调,直接传this即可);std::placeholders::_1是参数占位符,对应do_stuff()的第一个参数——如果do_stuff有多个参数,就依次添加_2、_3,数量要和成员函数的参数完全对应。
方法2:修复lambda无法访问mp_reader的问题
你说lambda可行但访问不了mp_reader?那肯定是没正确捕获类的上下文!lambda默认不会自动捕获类的成员变量,你需要在捕获列表里加上this指针(因为mp_reader是类的成员,this能帮你访问到它):
// 在类内部定义lambda的话,直接这么写 auto lambda_func = [this](/* 这里填do_stuff的参数类型,比如const SomeDDSData& data */) { // 现在可以正常访问mp_reader了 mp_reader->read_data(); // 也可以直接调用成员函数 this->do_stuff(data); }; // 把lambda传给DDS的目标函数 dds_target_function(lambda_func);
哪怕mp_reader是类的私有成员也没关系,只要lambda是在类内部定义的,捕获this后就有权限访问它。
两种方法怎么选?
- 如果你只是单纯要绑定成员函数,
std::bind写法更简洁; - 如果你需要在回调里加额外逻辑(比如先处理
mp_reader的数据再调用do_stuff),lambda的灵活性更高。
内容的提问来源于stack exchange,提问作者code_fodder
相关产品推荐
相关产品推荐

