0801-----C++Primer听课笔记----------C++11新特性 function 和 bind 的简单使用

1.function 和 函数指针

  1.1 function有函数指针的功能,但是使用起来明显比函数指针更加灵活和方便。

  1.2 函数指针和function的用法实例。

    1.2.1 函数指针首先要清楚函数指针的类型,如void (*)(int, char)等,然后声明一函数指针变量直接调用即可。

#include <iostream>
using namespace std;
/*
 * 函数指针的用法
 */

void test(int i,double j){
    cout << i << " " << j << endl;
}

int main(int argc, const char *argv[])
{
    void (*fp)(int, double);
    fp = test;
    fp(3, 2.3);

    1.2.2 function 和函数指针类型,需要函数的类型,定义一个该类的对象,用法和函数指针相同。

#include <iostream>
#include <functional>
using namespace std;
/*
 * c++11 function
 *
 */

void test(int i,double j){
    cout << i << " " << j << endl;
}

int main(int argc, const char *argv[])
{
    function<void (int, double)> fp;
    fp = test;
    fp(3, 2.3);
    return 0;
}

2.function 和 bind 的简单使用

  2.1 bind函数用来将一个function对象和一个函数实现绑定,这里使用了占位符,这里占位符所占的位置是调用的时候的位置。

  2.2 程序示例。

#include <iostream>
#include <string>
#include <functional>
using namespace std;

/*
 * bind 实现function的任意绑定
 *
 */

void test(int i, double d, const string &s){
    cout << "i = " << i << " d = " << d << " s = " << s << endl;
}

int main(int argc, const char *argv[])
{
    //1.void(*)(int, double)
    function <void (int, double)> fp;
    string s = "fp...";
    fp = bind(&test, std::placeholders::_1, std::placeholders::_2, s);
    fp(1, 1.1);

    //2. void(*)(double, int, const string &)
    function <void (double, int, const string &)> fp2;
    fp2 = bind(&test, std::placeholders::_2, std::placeholders::_1, std::placeho                                lders::_3);
    fp2(2.2, 2, "fp2...");

    //3. void(*)(const string &, int)
    function <void (const string &)> fp3;
    fp3 = bind(&test, 3, 3.3, std::placeholders::_1);
    fp3("fp3...");

    //4. void(*)(const string &, int , double)
    function <void (const string &, int, double)> fp4;
    fp4 = bind(&test, std::placeholders::_2, std::placeholders::_3, std::placeho                                lders::_1);
    fp4("fp4...", 4, 4.4);

    //5. void(*)(int)
    function <void (int)> fp5;
    fp5 = bind(&test, std::placeholders::_1, 5.5, "fp5...");
    fp5(5);

    //6. void(*)(const string &)
    function <void (const string &)> fp6;
    fp6 = bind(&test, 6, 6.6, std::placeholders::_1);
    fp6("fp6...");

    //7. void(*)()
    function <void ()> fp7;
    fp7 = bind(&test, 7, 7.7, "fp7...");
    fp7();


    return 0;
}

  2.3 function和bind的使用示例。

#include <iostream>
#include <string>
#include <vector>
#include <functional>
using namespace std;
/*
 * c++11 function
 *
 */

// void (*)()
void test(){
    cout << "test... " << endl;
}

class Test{
    public:

        //void (*)()
        static void test_static(){
            cout << "test static ..." << endl;
        }

        //void (Test::*)() //含有隐式参数 Test *
        void test2(){
            cout << "test2... In Test" << endl;
        }

        //void (Test::*)(int)
        void test3(int i){
            cout << i << " test3 ... In Test" << endl;
        }
};
int main(int argc, const char *argv[])
{
    function<void ()> fp;
    fp = test;
    fp();

    fp = Test::test_static; // static 函数名包含类名
    fp();

    Test t;
    fp = bind(&Test::test2, &t); //绑定一个对象的指针
    fp();

    fp = bind(&Test::test3, &t, 3);
    fp();

    // test3  转换成 void (*)(int)类型的
    function<void (int)> fp2;
    fp2 = bind(&Test::test3, &t, std::placeholders::_1);
    fp2(2000);

    return 0;
}

  

 

posted @ 2014-08-01 19:21  Monica_Lee  阅读(323)  评论(0编辑  收藏  举报