c++ | bind 和function

文章介绍了C++11中的bind绑定器功能,如何在函数模板和类模板中使用,以及如何通过function将绑定功能延伸。重点讲解了bind的使用场景和参数占位符的用法。
//绑定器只能在语句内有效,使用function赋值函数?不知道描述的合理不合理 反正就是 可以拿过来用

//在头文件 funtion
//bind是在boost c++11 新特性
/*

c++  bind绑定器 --> 返回的结果还是一个函数对象

*/

void hello(string str1, string str2){
    cout<<str1<<"\n"<<str2<<endl;
}

class TEST{
public:
    TEST(){};
    ~TEST(){};
    int sum(int x, int y){
        return x * y;
    }
};
int main(){
    //函数模板不需要给类型      可以自动推演模板类型参数        语法    bind(函数名, 实参...)();
    //注意 类模板需要给类型
    bind(hello, "hello bind...", "my namne is zhangbuda")();
    int ans = bind(&TEST::sum, TEST(), 10, 20)();       //其中TEST() 是函数对象         类的使用需要对象调用
    cout<<ans<<endl;

    //bind 只能在语句中使用     第二种用法,使用参数占位符
    //最多20个参数占位符
    cout<<"twice"<<endl;
    bind(hello, placeholders::_1, placeholders::_2)("hello bind...", "my namne is zhangbuda");

    cout<<bind(&TEST::sum, TEST(), placeholders::_1, placeholders::_2)(30, 40);

    //由于绑定除了语句就无法使用,那怎么延伸? 使用function 
    //通过function 把绑定的功能延伸
    function<int (int, int)> func1 = bind(&TEST::sum, TEST(), placeholders::_1, placeholders::_2);
    cout<<"\n"<<func1(22, 33);
    return 0;
}
C++11 引入的 `std::function` `std::bind` 为现代 C++ 编程带来了极大便利。`std::function` 允许统一存储操作不同类型的可调用对象,简化代码结构;`std::bind` 则能灵活调整函数参数调用方式,提高代码的可读性可维护性 [^1]。 ### std::function `std::function` 是一个通用的多态函数包装器,它可以存储、复制调用任何可调用对象,包括函数、函数指针、成员函数指针、仿函数、lambda 表达式等。其使用方法是在模板参数中指定可调用对象的签名,然后用它来存储对应的可调用对象。 以下是一个简单的示例: ```cpp #include <iostream> #include <functional> // 普通函数 int add(int a, int b) { return a + b; } int main() { // 定义一个 function 对象,它可以存储返回值为 int,参数为两个 int 的可调用对象 std::function<int(int, int)> func = add; std::cout << func(1, 2) << std::endl; return 0; } ``` `std::function` 的原理是它内部维护了一个类型擦除机制,通过虚函数表来调用存储的可调用对象,从而实现了对不同类型可调用对象的统一存储调用。 ### std::bind `std::bind` 用于创建一个新的可调用对象,它可以调整原可调用对象的参数绑定调用方式。可以绑定普通函数,也可以绑定成员函数。在绑定参数时,可以使用 `std::placeholders` 来占位,表示在调用新的可调用对象时再传入这些参数。 以下是绑定普通函数成员函数的示例: ```cpp #include <iostream> #include <functional> // 普通函数 int add(int x, int y) { return x + y; } // 成员函数 class ADD { public: int add(int x, int y) { return x + y; } }; int main() { ADD obj; // 绑定普通函数返回函数对象 auto f1 = std::bind(add, std::placeholders::_1, 2); // 绑定成员函数返回函数对象 auto f2 = std::bind(&ADD::add, &obj, 2, std::placeholders::_1); std::cout << f1(1) << std::endl; std::cout << f2(1) << std::endl; return 0; } ``` `std::bind` 的原理是它会生成一个新的可调用对象,这个新对象内部保存了原可调用对象绑定的参数,当调用新对象时,会根据绑定的参数占位符将参数传递给原可调用对象进行调用。 ### 二者结合使用 由于 `std::bind` 可以包装可调用对象并返回可调用对象,而 `std::function` 也能包装可调用对象,所以 `std::function` 可以包装 `std::bind` 生成的对象 [^3]。 以下是结合使用的示例: ```cpp #include <iostream> #include <functional> int add(int a, int b) { return a + b; } int main() { auto bindObj = std::bind(add, std::placeholders::_1, 2); std::function<int(int)> func = bindObj; std::cout << func(3) << std::endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值