美文网首页
C++11 中 std::function 和 std::bin

C++11 中 std::function 和 std::bin

作者: Gwkang | 来源:发表于2020-03-07 17:46 被阅读0次

    直接看代码,代码说明一切

    #include <functional>
    #include <iostream>
    
    using namespace std;
    
    class Test
    {
    public:
        double test(int a, int b)
        {
            cout << "a = " << a << "  b = " << b << endl;
            return 0;
        }
    };
    
    double globalTest(int a, int b)
    {
        cout << "a = " << a << "  b = " << b << endl;
        return 0;
    }
    
    int main(void)
    {
        // 最普通的用法,直接绑定全局函数
        {
            // <> 里的返回值和参数需要 和 要绑定的函数参数和返回值对应上
            std::function<double(int, int)> f = &globalTest;
            f(2, 3);
    
            // 输出 a = 2  b = 3
        }
    
        
        Test t;
    
        // 绑定成员函数
    
        {
            std::function<double(Test & obj,int, int)> f = &Test::test;
            t.test(1, 2);
    
            // obj 是调用这个函数的对象,这里用t.text,那么obj就是t的引用
            // 输出 a = 1  b = 2
        }
        
        {
            std::function<double()> f = std::bind(&Test::test, &t, 2, 3);
            //f(9, 10);     // err 编译错误, 函数接收的参数是根据 double() 括号中的参数决定的
            f(); // ok  函数接收到的值是 9
    
            // 输出 a = 2  b = 3
        }
    
        {
            std::function<double(int)> f = std::bind(&Test::test, &t, 5, 6);
            //f(); // err 编译错误  参数匹配不上
            f(3);   // 编译成果,但是 3 被抛弃了,函数接受到的值是 9和10
    
            // 输出 a = 5  b = 6
        }
    
        //std::placeholders::_1 占位符
    
        {
            std::function<double(int)> f = std::bind(&Test::test, &t, std::placeholders::_1, 15);
            
            f(2);   //函数接收到的值是 2 15
            //f(2, 10); // err 参数匹配不上  f只接受一个参数
    
            // 输出 a = 2  b = 15
        }
        
        {
            std::function<double(int, int)> f= std::bind(&Test::test, &t, std::placeholders::_1, std::placeholders::_1);
            f(9, 15);   // 函数接收到的值是 9, 9
    
            // std::placeholders::_1 占位符接收到的值都是9
    
            // 输出 a = 9  b = 9
        }
    
        {
            std::function<double(int, int)> f= std::bind(&Test::test, &t, std::placeholders::_2, std::placeholders::_1);
            f(9, 15);   // 函数接收到的值是 15, 9
    
            // std::placeholders::_1 占位符接收到的值是 15
            // std::placeholders::_2 占位符接收到的值是 9
    
            // 输出 a = 15  b = 9
        }
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:C++11 中 std::function 和 std::bin

          本文链接:https://www.haomeiwen.com/subject/gvchdhtx.html