std::function为何能绑定参数数量不一致的不同类型函数
原因解析
你觉得类型不匹配的核心误区,是统计成员函数参数时漏掉了C++非静态成员函数隐式生成的this指针参数,结合std::bind的规则就能完全说通:
- 非静态成员函数的显式参数列表里只有1个
const double,但编译器会隐式给它追加第一个入参:指向类实例的this指针。由于state_function是const成员函数,这个隐式参数的类型是const Test*,算上它之后,state_function本质是接收2个入参、返回int的函数,并非你认为的只接收1个参数。你可以把&Test::state_function的类型近似理解为int(const Test*, const double)。 std::bind的占位符规则是:_N代表绑定生成的可调用对象被调用时,传入的第N个实参。你写的std::bind(&Test::state_function, _1, _2),意思就是调用绑定对象时,第一个实参传给成员函数当隐式this指针,第二个实参传给成员函数当显式声明的const double value入参,刚好凑齐成员函数运行需要的所有参数。- 你定义的
func_type是std::function<int(Test* const, const double)>,要求存储的可调用对象接收两个入参:第一个是Test* const类型,第二个是const double类型,返回int。这里第一个参数Test* const(指向非const Test实例的const指针)可以隐式转换为成员函数需要的const Test*(指向const Test实例的指针),仅增加const权限限定,不存在类型冲突;第二个参数double类型完全匹配,所以整个绑定、存入map的操作完全合法。
补充:日常开发中更常见的成员函数绑定写法是提前把this指针绑定死,比如
std::bind(&Test::state_function, this, _1),这种写法生成的可调用对象只需要接收1个double参数即可。你当前的写法没有提前绑定this,而是把this作为调用时的第一个入参通过占位符传入,所以对应双参数的function签名,逻辑完全自洽。
内容的提问来源于stack exchange,提问作者tanghz
相关产品推荐
相关产品推荐

