You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:18:44