如何通过std::bind直接获取对象成员而非对象本身?
直接用std::bind从B类对象获取val成员的方案
当然可以实现你的需求!你不需要分两步先获取A再提取val,通过嵌套std::bind就能一步到位,另外还有可读性更强的lambda替代方案,下面具体说明:
方法1:嵌套std::bind
你可以把获取B::a的bind表达式作为参数,传给绑定A::val的bind,这样调用时会自动先从B对象中取出A,再提取val成员。代码示例如下:
#include <functional> struct A { A(float _val) : val(_val) {} float val; }; struct B { B(float _val) : a(_val) {} A a; }; int main() { B b{ 2.0f }; // 直接绑定嵌套的成员访问逻辑 auto get_val_from_b = std::bind(&A::val, std::bind(&B::a, std::placeholders::_1)); float val = get_val_from_b(b); // 直接得到2.0f,无需中间的A对象 return 0; }
原理很简单:当调用get_val_from_b(b)时,首先执行内层的std::bind(&B::a, _1),传入b得到b.a;接着把这个A对象作为参数传给外层的std::bind(&A::val, ...),最终返回b.a.val。
方法2:使用Lambda表达式(更推荐)
虽然嵌套bind能解决问题,但可读性稍差。在C++11及以后,lambda表达式是更直观的选择,代码逻辑一目了然:
#include <functional> struct A { A(float _val) : val(_val) {} float val; }; struct B { B(float _val) : a(_val) {} A a; }; int main() { B b{ 2.0f }; // 用lambda直接访问成员,可读性更强 auto get_val_from_b = [](const B& b_obj) { return b_obj.a.val; }; float val = get_val_from_b(b); // 同样直接得到2.0f return 0; }
lambda不仅写法简洁,而且类型更明确,调试起来也比嵌套bind更容易,是这类场景下的首选方案。
内容的提问来源于stack exchange,提问作者Thomas B.
相关产品推荐
相关产品推荐

