zoukankan      html  css  js  c++  java
  • c++的bind使用方法

    c++的bind使用方法

    除了容器有适配器之外,其实函数也提供了适配器,适配器的特点就是将一个类型改装成为拥有子集功能的新的类型。其中函数的适配器典型的就是通过std::bind来实现。

    std::bind函数定义在头文件functional中,是一个函数模板,它就像一个函数适配器,接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺序调整等操作。

    可调用 (Callable) 中描述,调用指向非静态成员函数指针或指向非静态数据成员指针时,首参数必须是引用或指针(可以包含智能指针,如 std::shared_ptrstd::unique_ptr),指向将访问其成员的对象。

    官方示例

    #include <random>
    #include <iostream>
    #include <memory>
    #include <functional>
     
    void f(int n1, int n2, int n3, const int& n4, int n5)
    {
        std::cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << n4 << ' ' << n5 << '\n';
    }
     
    int g(int n1)
    {
        return n1;
    }
     
    struct Foo {
        void print_sum(int n1, int n2)
        {
            std::cout << n1+n2 << '\n';
        }
        int data = 10;
    };
     
    int main()
    {
        using namespace std::placeholders;  // 对于 _1, _2, _3...
     
        // 演示参数重排序和按引用传递
        int n = 7;
        // ( _1 与 _2 来自 std::placeholders ,并表示将来会传递给 f1 的参数)
        auto f1 = std::bind(f, _2, 42, _1, std::cref(n), n);
        n = 10;
        f1(1, 2, 1001); // 1 为 _1 所绑定, 2 为 _2 所绑定,不使用 1001
                        // 进行到 f(2, 42, 1, n, 7) 的调用
     
        // 嵌套 bind 子表达式共享占位符
        auto f2 = std::bind(f, _3, std::bind(g, _3), _3, 4, 5);
        f2(10, 11, 12); // 进行到 f(12, g(12), 12, 4, 5); 的调用
     
        // 常见使用情况:以分布绑定 RNG
        std::default_random_engine e;
        std::uniform_int_distribution<> d(0, 10);
        std::function<int()> rnd = std::bind(d, e); // e 的一个副本存储于 rnd
        for(int n=0; n<10; ++n)
            std::cout << rnd() << ' ';
        std::cout << '\n';
     
        // 绑定指向成员函数指针
        Foo foo;
        auto f3 = std::bind(&Foo::print_sum, &foo, 95, _1);
        f3(5);
     
        // 绑定指向数据成员指针
        auto f4 = std::bind(&Foo::data, _1);
        std::cout << f4(foo) << '\n';
     
        // 智能指针亦能用于调用被引用对象的成员
        std::cout << f4(std::make_shared<Foo>(foo)) << '\n'
                  << f4(std::make_unique<Foo>(foo)) << '\n';
    }
    

    输出:

    2 42 1 10 7
    12 12 12 4 5
    1 5 0 2 0 8 2 2 10 8
    100
    10
    10
    10
    

    更多编程资料见公众号

  • 相关阅读:
    imperva_waf导入ssl证书
    博科光纤交换机初始化配置
    xss测试代码
    生成树注意事项
    [转载]Basics of the Unix Philosophy
    [转载]GSview注册码
    [转载]tar命令详解
    [转载]WinEdt 6 注册 试用期30天永不过期
    [转载+修改]计数排序
    [转载]C++ 关于声明,定义,类的定义,头文件作用,防止头文件在同一个编译单元重复引用,不具名空间
  • 原文地址:https://www.cnblogs.com/xutopia/p/15768939.html
Copyright © 2011-2022 走看看