0

0

C++如何使用std::bind和占位符?(函数封装)

尼克

尼克

发布时间:2025-12-31 17:17:24

|

202人浏览过

|

来源于php中文网

原创

std::bind可预先绑定函数参数生成新可调用对象,通过占位符\_1、\_2等指定调用时的实参位置,支持普通函数、成员函数(需传对象)及泛型适配,但Lambda通常更推荐。

c++如何使用std::bind和占位符?(函数封装)

std::bind 可以把函数、成员函数或可调用对象“预先绑定”一部分参数,生成一个新的可调用对象,适合做回调、延迟调用或接口适配。关键在于理解占位符(_1, _2, …)代表将来调用时传入的位置参数。

基本语法和占位符含义

std::bind 返回一个仿函数对象,调用它时会把实参按顺序填入占位符位置,再调用原函数。占位符定义在 std::placeholders 命名空间里,最常用的是 _1(第一个参数)、_2(第二个参数)等。

例如:

using namespace std::placeholders;

auto f = std::bind(foo, 42, _1, _2); 意思是:调用 f(x, y) 等价于调用 foo(42, x, y)_1 对应 x_2 对应 y

绑定普通函数和自由函数

适用于固定部分参数,简化后续调用。

知了追踪
知了追踪

AI智能信息助手,智能追踪你的兴趣资讯

下载

立即学习C++免费学习笔记(深入)”;

  • 有三个参数的函数:void log(int level, const char* tag, const char* msg);
  • 想封装成只接受 msg 的日志函数:
    auto info_log = std::bind(log, 1, "INFO", _1);
    后续直接写 info_log("connection established"); 即可。
  • 也可以跳过中间参数:auto quick_msg = std::bind(log, _1, "DEBUG", _2);,调用时 quick_msg(3, "timeout")log(3, "DEBUG", "timeout")

绑定成员函数(需传入对象实例)

成员函数隐含 this 指针,所以第一个参数必须是对象(指针或引用)。

  • struct Printer { void print(int x, const char* s) { ... } };
  • 绑定到具体对象:
    Printer p;
    auto p_print = std::bind(&Printer::print, &p, _1, _2);
    p_print(100, "done"); // 相当于 p.print(100, "done")
  • std::ref(p) 绑定引用,避免拷贝;若想支持不同对象,可把对象也设为占位符:std::bind(&Printer::print, _1, _2, _3),调用时传入 p, 42, "ok"

与 lambda 的对比和使用建议

std::bind 功能强大但语法稍重,C++11 后多数场景推荐用 lambda,更直观、性能更好、支持移动捕获。

  • 等效写法:auto f = [](int x) { return foo(42, x, "default"); };
  • std::bind 在某些泛型代码中仍有优势,比如配合 std::function 存储、STL 算法(如 std::transform)需要预绑定时。
  • 注意:绑定后对象生命周期需自行管理,尤其绑定临时对象或裸指针时容易悬垂。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.09.27

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

519

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

521

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

48

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

173

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

92

2025.11.27

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号