c++11绑定器bind

在c++11中,为函数的参数绑定增加了binder(绑定器),比以前版本的bind1st和bind2nd方便很多,功能也强大很多。


配合auto关键字,bind可以实现将参数绑定成固定值和改变参数的顺序。


当遇见重载的函数是,需要在绑定是,将函数指针(函数名)强制转换为相应的具体类型才行。


具体的实例见下面的代码,具体使用见注释:

<pre name="code" class="cpp">
#include <iostream>
#include <string>
#include <functional>

using namespace std;
<span style="background-color: rgb(51, 255, 51);">using namespace std::placeholders</span>;<span style="color:#ffcc66;"> </span><span style="color:#330033;background-color: rgb(255, 255, 0);"> //bind中用到的_1,_2的命名空间</span><span style="color:#ffcc66;">
</span>
void func(int num, const string& str)
{
	cout<<"func("<<num<<","<<str<<")"<<endl;
}

void overloaded(int num)
{}

void overloaded(float f)
{}

int main()
{
	//把第二个参数绑定为固定的值
	string str = "buaa";
	auto f1 = bind(func,<span style="background-color: rgb(51, 255, 51);"> _1, str</span>);
	f1(16);

	//重新安排参数的顺序
	auto f2 = bind(func, <span style="background-color: rgb(51, 255, 51);">_2, _1</span>);
	f2("test", 32);

	//重载函数的时候绑定必须制定绑定重载的类型
	auto f3 = bind(<span style="background-color: rgb(51, 255, 51);">(void(*)(float))overloaded</span>, _1);

	system("pause");
	return 0;
}



具体的下过见下图所示:


此外不得不赞下auto,太尼玛的好用了,万金油啊!

### C++ 中 `std::bind` 绑定成员函数 在 C++11 中,`std::bind` 提供了一种机制来绑定成员函数及其所属的对象或指针。通过这种方式,可以将成员函数转换为普通的可调用对象(如函数对象),从而简化回调或其他场景下的使用。 以下是关于如何使用 `std::bind` 来绑定成员函数的具体示例: #### 示例代码 假设有一个简单的类 `MyClass`,其中定义了一个成员函数 `printMessage`,该函数接受一个字符串作为参数并打印出来。 ```cpp #include <iostream> #include <functional> // 包含 std::bindstd::function class MyClass { public: void printMessage(const std::string& message) const { std::cout << "Message: " << message << std::endl; } }; int main() { MyClass obj; // 创建类的实例 // 使用 std::bind 将成员函数与对象绑定 auto boundFunction = std::bind(&MyClass::printMessage, &obj, std::placeholders::_1); // 调用绑定后的函数对象 boundFunction("Hello from bind!"); // 输出 Message: Hello from bind! return 0; } ``` 在这个例子中,`std::bind` 将 `MyClass::printMessage` 成员函数与其对应的对象 `obj` 进行绑定,并允许我们稍后通过调用返回的函数对象来执行此方法[^2]。 #### 关键点析 - **第一个参数**:指定要绑定的成员函数地址 (`&MyClass::printMessage`)。 - **第二个参数**:提供成员函数所属的对象或指针 (`&obj`)。 - **占位符 `_1`**:表示实际调用时的第一个参数位置。如果需要更多参数,则可以继续使用 `_2`, `_3` 等[^5]。 此外,还可以利用 `std::function` 存储由 `std::bind` 返回的结果以便后续多次调用。 ```cpp // 定义 std::function 对象以存储绑定结果 std::function<void(const std::string&)> func; // 将绑定结果赋值给 func func = std::bind(&MyClass::printMessage, &obj, std::placeholders::_1); // 多次调用 func func("First call"); // 输出 Message: First call func("Second call"); // 输出 Message: Second call ``` 这种灵活性使得 `std::bind` 在处理复杂调用链路时非常有用[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值