C++跨类传递std::function时如何正确传递引用参数
问题原因
你得到返回值5的核心原因是std::bind的用法错误:
- 你当前写的
std::bind(&SquareBox::sq_func,&sq_box,a,x),已经把sq_func需要的两个入参全部提前绑定成了局部变量a(值为5)、x(值为1)的拷贝,生成的可调用对象会完全丢弃后续调用时传入的所有参数,固定执行sq_func(5,1),返回值自然是5,根本不会用到Box内部传入的4和m_data=45。 - 你代码里定义的
x是完全多余的,第二个参数位置你本来就需要接收Box调用回调时传入的m_data,不应该提前绑定固定值。
修复方案
使用std::placeholders里的占位符标记需要延迟传参的位置,占位符_N代表“这个位置的参数,取回调被实际调用时传入的第N个实参”。
你的回调f的签名是int(int, int&),被Box::get_box_dimension调用时传入的第一个参数是4,第二个参数是m_data的引用,对应占位符_1和_2。
你预期结果是5*45,也就是sq_func第一个参数固定为a=5,第二个参数取回调传入的m_data,只需要把绑定代码里的x替换为std::placeholders::_2即可。
修复后代码
仅需要修改main.cpp中的回调绑定逻辑,其余文件不需要改动:
#include<iostream> #include<functional> #include"Box.h" #include"SquareBox.h" int main() { int a = 5; Box b; SquareBox sq_box; // 第二个参数用_2占位,接收回调调用时传入的第二个参数即m_data b.set_callback(std::bind(&SquareBox::sq_func, &sq_box, a, std::placeholders::_2)); int ret_val = b.get_box_dimension(); std::cout << "Return Value == " << ret_val << std::endl; return 0; }
运行后输出Return Value == 225,符合5*45的预期。
额外说明
- 如果你希望
sq_func的第一个参数使用Box传入的4而不是固定值5,只需要把绑定位置的a替换为std::placeholders::_1,此时运行结果为4*45=180。 - 如果后续需要绑定引用类型的固定参数,不要直接传入变量名,
std::bind默认会对绑定的参数做值拷贝,需要用std::ref(变量名)包裹才能传递引用。使用占位符的场景不需要额外处理,会自动匹配回调签名的引用类型。
内容的提问来源于stack exchange,提问作者K_TGTK
相关产品推荐
相关产品推荐

