c++11-std::function&bind

本文介绍了C++中std::function和std::bind的应用,包括它们的定义、使用方法及如何作为回调函数和参数传递。此外,还展示了如何通过bind简化函数调用并实现多元函数的一元化。

std::function

可调用对象如下:

  1. 是一个函数指针
  2. 一个具有operator()成员函数的类对象
  3. 一个可被转换为函数指针的类对象
  4. 是一个类成员指针

std::function是可调用对象包装器,是一个类模版,可以容纳除类成员函数指针外的所有可调用对象。

头文件是<functional>

void func(void)

{

}

class Foo

{

  public:

         static int foo_func(int a);

}

class Bar

{

public:

int operator()(int a);

}

std::function<void(void)> fr1=func;

std::function<int(int)> fr2=Foo::foo_func;

用途:

1.可以作为回调函数,作为函数的参数

call_when_even(int x, const std::function<void(int)>& f);

 

std::bind

std::bind可以把函数数的参数进行绑定,并把返回对象用std::function进行保存。

1.将可调用对象与其参数以前绑定为一个仿函数

2.将多元可调用对象转成一元或者(n-1)元可调用对象

auto fr=std::bind(output,std::placeholder::_1);

auto fr=std::bind(output,std::placeholder::_1,2)(1);

std::placeholder_1是一个占位符,代表这个位置将在函数调用的时候,被传入的第一个参数所替代。

1.使用binder简化和增强的bind1st,bind2nd

int count=std::count_if(coll.begin(),coll.end(),std::bind1st(less<int>(),10);

std::bind2nd(less<int>(),10);

2.使用组合bind函数

查找集合中大于5,小于10的元素个数

std::bind(std::greater<int>(),std::placeholders::_1,5);

using std::placeholders::_1;

auto f=std::bind(std::logical_and<bool>(),std::bind(std::greater<int>(),_1,5),std::bind(std::less_equal<int>(),_1,10);

int count=std::count_if(coll.begin(),coll.end(),f);

 

 

 

 

}

### 绑定成员函数到 `std::function` 的方法 在 C++11 中,`std::function` 是一个通用的可调用对象包装器,它可以封装包括成员函数在内的多种调用形式。由于成员函数的调用需要一个对象上下文(即 `this` 指针),因此在绑定成员函数时,必须提供一个对象实例或占位符,以便在调用时能够正确解析调用目标。 `std::bind` 是实现这种绑定的关键工具,它允许将成员函数与特定对象绑定,或者延迟绑定,通过占位符保留参数位置,直到实际调用时再提供。 ### 示例:绑定成员函数并使用 `std::function` 以下是一个完整的示例,展示如何将成员函数绑定到 `std::function` 并调用它: ```cpp #include <iostream> #include <functional> class MyClass { public: void memberFunction(int value) { std::cout << "成员函数被调用,值为: " << value << std::endl; } }; int main() { MyClass obj; // 使用 std::bind 将成员函数与对象绑定 std::function<void(int)> func = std::bind(&MyClass::memberFunction, &obj, std::placeholders::_1); // 调用绑定的函数 func(42); // 输出:成员函数被调用,值为: 42 return 0; } ``` 在这个示例中,`std::bind` 的第一个参数是成员函数指针 `&MyClass::memberFunction`,第二个参数是对象的地址 `&obj`,表示该成员函数调用将作用于 `obj` 实例上。`std::placeholders::_1` 是一个占位符,表示第一个参数将在调用时传入。 ### 示例:延迟绑定对象(绑定成员函数但不指定对象) 如果希望在调用时动态指定对象,可以使用 `std::bind` 的占位符来延迟绑定对象: ```cpp #include <iostream> #include <functional> class MyClass { public: void memberFunction(int value) { std::cout << "成员函数被调用,值为: " << value << std::endl; } }; int main() { // 延迟绑定对象 std::function<void(MyClass&, int)> func = std::bind(&MyClass::memberFunction, std::placeholders::_1, std::placeholders::_2); MyClass obj; func(obj, 42); // 输出:成员函数被调用,值为: 42 return 0; } ``` 这里,`std::placeholders::_1` 表示第一个参数(对象)将在调用时提供,`std::placeholders::_2` 表示第二个参数(`int` 值)也将延迟绑定。 ### 示例:绑定静态成员函数 静态成员函数不需要对象实例,因此绑定方式与普通函数类似: ```cpp #include <iostream> #include <functional> class MyClass { public: static void staticMemberFunction(int value) { std::cout << "静态成员函数被调用,值为: " << value << std::endl; } }; int main() { // 静态成员函数绑定无需对象 std::function<void(int)> func = &MyClass::staticMemberFunction; func(42); // 输出:静态成员函数被调用,值为: 42 return 0; } ``` 由于静态成员函数不依赖于对象,因此可以直接赋值给 `std::function`,也可以使用 `std::bind` 进行绑定,但不需要传递对象参数。 ### 总结 `std::function` 和 `std::bind` 的结合使用,使得绑定成员函数成为一种灵活的方式,既支持绑定特定对象,也支持延迟绑定对象,甚至可以绑定静态成员函数。通过 `std::placeholders::_1` 等占位符,可以控制参数的绑定时机,从而实现更通用的函数包装机制[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值