全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何将回调函数作为模板参数?(代码示例)

C++中推荐用template + F&&参数接收任意可调用对象,支持函数指针、lambda(含捕获)和functor,零成本抽象;函数指针模板适用于无捕获场景且需极致性能;std::function适合需存储或类型不确定的场合。

在C++中,可以把回调函数类型(函数指针、函数对象或lambda)作为模板参数传入,但具体方式取决于回调的“可调用性”和是否需要捕获上下文。核心思路是:用auto模板参数(C++17起)接收任意可调用对象,或用显式函数指针/仿函数类型模板参数。

用 auto 模板参数接收任意可调用对象(推荐)

这是最通用、最现代的方式,支持函数指针、lambda(含捕获)、functor等,且无需提前声明类型。

template
void process_data(int x, F&& callback) {
    int result = x * 2;
    std::forward(callback)(result); // 完美转发调用
}

// 使用示例 int main() { // 普通函数 auto func = [](int v) { std::cout << "lambda: " << v << '\n'; }; process_data(5, func); // OK

// 带捕获的 lambda
int offset = 10;
process_data(5, [offset](int v) { std::cout << "captured: " << v + offset << '\n'; });

// 函数指针
void print(int v) { std::cout << "func ptr: " << v << '\n'; }
process_data(5, print);

}

用函数指针类型作为模板参数(无捕获、类型明确)

适用于只接受普通函数或不带捕获的lambda(可隐式转为函数指针),类型安全且零开销,但无法处理捕获型lambda。

template
void process_with_fp(R(*callback)(Args...)) {
    // 调用示例:假设 callback 接收 int,返回 void
    if constexpr (std::is_same_v && sizeof...(Args) == 1 &&
                  std::is_same_v, int>) {
        callback(42);
    }
}

// 使用 void my_handler(int x) { std::cout << "handled: " << x << '\n'; } process_with_fp(my_handler); // process_with_fp([](int x){}); // ❌ 错误:带捕获 lambda 不能转成函数指针

用 std::function 包装(运行时类型擦除,灵活性高)

不是模板参数,但常被用来替代——把回调作为普通函数参数,内部用std::function存储。适合回调类型不确定或需存储/传递的场景。

#include 

void process_stdfunc(std::function callback) { callback(100); }

int main() { process_stdfunc([](int v) { std::cout << v << '\n'; }); process_stdfunc([](int v) { std::cout << "with capture: " << v * 2 << '\n'; }); }

注意事项与选择建议

  • 优先用 template + F&& 参数:零成本抽象,支持所有可调用对象,配合 std::forward 避免拷贝。
  • 避免把 lambda 当模板非类型参数(NTTP):C++20 允许某些字面量 lambda 作 NTTP,但限制极多(无捕获、仅字面量运算),实用性低,不推荐常规使用。
  • 函数指针模板适合嵌入式或极致性能场景:无类型擦除开销,但牺牲灵活性。
  • std::function 适合需要存储、延迟调用或类型混合的场合:有小开销(虚调用或小对象优化),但接口统一。


# 回调函数  # ai  # c++  # red  # auto  # 无类型  # Lambda  # 指针  # 接口  # 指针类型  # function  # 对象  # 回调  # 适用于  # 不确定  # 这是  # 擦除  # 不带  # 转成  # 或用  # 极多  # 性高 


相关文章: 网站制作公司排行榜,抖音怎样做个人官方网站  零服务器AI建站解决方案:快速部署与云端平台低成本实践  c# Task.ConfigureAwait(true) 在什么场景下是必须的  哈尔滨网站建设策划,哈尔滨电工证查询网站?  建站之星好吗?新手能否轻松上手建站?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何快速启动建站代理加盟业务?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  如何通过远程VPS快速搭建个人网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  企业微网站怎么做,公司网站和公众号有什么区别?  C++如何使用std::optional?(处理可选值)  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  外贸公司网站制作哪家好,maersk船公司官网?  如何快速查询域名建站关键信息?  如何在云主机上快速搭建网站?  自助网站制作软件,个人如何自助建网站?  如何零成本快速生成个人自助网站?  网站企业制作流程,用什么语言做企业网站比较好?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何通过NAT技术实现内网高效建站?  香港服务器部署网站为何提示未备案?  文字头像制作网站推荐软件,醒图能自动配文字吗?  郑州企业网站制作公司,郑州招聘网站有哪些?  湖北网站制作公司有哪些,湖北清能集团官网?  c# 服务器GC和工作站GC的区别和设置  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  如何在腾讯云服务器上快速搭建个人网站?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  如何快速搭建高效WAP手机网站?  详解jQuery停止动画——stop()方法的使用  网站制作费用多少钱,一个网站的运营,需要哪些费用?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何选择高性价比服务器搭建个人网站?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  小型网站建站如何选择虚拟主机?  实例解析Array和String方法  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  简单实现Android验证码  如何通过多用户协作模板快速搭建高效企业网站?  大连 网站制作,大连天途有线官网?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  网站制作价目表怎么做,珍爱网婚介费用多少?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何通过西部数码建站助手快速创建专业网站?  微信小程序 input输入框控件详解及实例(多种示例)  学校免费自助建站系统:智能生成+拖拽设计+多端适配 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。