C++中获取对象方法调用引用的可行性、相关技术术语及参数预设实现问询
嘿,这两个需求在C++里都有清晰的解决方案,咱们一个个说:
1. 获取对象方法的可调用“引用”
首先得明确:C++里不能直接像普通函数那样取成员函数的引用(比如你写的auto& refToBarNoArgs = f.barNoArgs;是不合法的),因为成员函数必须依附于对象实例才能调用。不过有几种替代方案,对应的技术名称是成员函数指针和可调用对象包装(用std::function):
方案一:成员函数指针
成员函数的类型是返回值 (类名::*)(参数列表),比如barNoArgs的类型是void (Foo::*)()。使用时需要绑定对象实例:
struct Foo { void barNoArgs(); void barMultArgs(int, float, bool); }; Foo f; // 定义成员函数指针并赋值 void (Foo::*barNoArgsPtr)() = &Foo::barNoArgs; // 调用时需要用 .* (对象)或 ->* (指针)语法 (f.*barNoArgsPtr)(); // 等价于 f.barNoArgs()
方案二:用std::function+std::bind包装
这种方式更接近你想要的“引用”体验,调用起来更简洁:
#include <functional> Foo f; // 绑定对象f和成员函数,得到一个可直接调用的对象 std::function<void()> refToBarNoArgs = std::bind(&Foo::barNoArgs, &f); refToBarNoArgs(); // 直接调用,和普通函数一样
2. 预设部分参数(参数绑定)
你想要固定某个方法的部分参数,剩下的参数留到调用时传入,这个技术叫参数绑定,C++里常用两种方式实现:
方式一:std::bind(C++11及以后)
用std::placeholders::_1、_2等占位符表示“调用时需要传入的参数”,固定的参数直接写进去:
#include <functional> Foo f; // 绑定对象f、第二个参数3.14f,_1和_2分别对应调用时的第一个、第三个参数 auto refToBarMultArgs = std::bind( &Foo::barMultArgs, &f, std::placeholders::_1, 3.14f, std::placeholders::_2 ); // 调用时只传占位符对应的参数 refToBarMultArgs(42, true); // 等价于 f.barMultArgs(42, 3.14f, true)
方式二:Lambda表达式(更推荐,可读性更好)
Lambda可以直接捕获对象,然后在函数体内固定参数,语法更直观:
Foo f; // 捕获对象f,定义调用时需要传入的参数a和b,固定第二个参数为3.14f auto refToBarMultArgs = [&f](int a, bool b) { f.barMultArgs(a, 3.14f, b); }; refToBarMultArgs(42, true); // 同样实现需求
总结一下
- 获取对象方法的可调用“引用”:核心技术是成员函数指针,或者用
std::function结合std::bind/lambda来包装成更易用的可调用对象; - 预设部分参数:技术名称是参数绑定,推荐用Lambda表达式(C++11+),或者
std::bind(需要包含<functional>头)。
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

