3、可调用对象包装器(std::function)

一、可调用对象包装器:

  std::function是可调用对象的包装器。它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指针,并允许保存和延迟执行它们。

二、基本用法:

(1)包装普通函数

#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;

int g_Minus(int i, int j)
{
    return i - j;
}

int main()
{
    function<int(int, int)> f = g_Minus;
    cout << f(1, 2) << endl;

    system("pause");
    return 0;
}

(2)包装模板函数

#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;

template<typename T>
T g_Minus(T i, T j)
{
    return i - j;
}

int main()
{
    function<int(int, int)> f = g_Minus<int>;
    cout << f(1, 2) << endl;

    system("pause");
    return 0;
}

(3)包装lambda表达式

#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;

auto g_Minus = [](int i, int j){return i - j; };

int main()
{
    function<int(int, int)> f = g_Minus;
    cout << f(1, 2) << endl;

    system("pause");
    return 0;
}

(4)包装函数对象

  1)非模板类型:

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

struct Minus
{
    int operator() (int i, int j)
    {
        return i - j;
    }
};

int main()
{
    function<int(int, int)> f = Minus();
    cout << f(1, 2) << endl;                                            // -1
    return 1;
}

  2)模板类型:

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

template <class T>
struct Minus
{
    T operator() (T i, T j)
    {
        return i - j;
    }
};

int main()
{
    function<int(int, int)> f = Minus<int>();
    cout << f(1, 2) << endl;                                            // -1
    return 1;
}

(5)包装类静态成员函数

  1)非模板类型:

#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;

class Math
{
public:
    static int Minus(int i, int j)
    {
        return i - j;
    }
};

int main()
{
    function<int(int, int)> f = &Math::Minus;
    cout << f(1, 2) << endl;

    system("pause");
    return 0;
}

  2)模板类型:

#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;

class Math
{
public:
    template <typename T>
    static T Minus(T i, T j)
    {
        return i - j;
    }
};

int main()
{
    function<int(int, int)> f = &Math::Minus<int>;
    cout << f(1, 2) << endl;

    system("pause");
    return 0;
}

(6)包装类对象成员函数

  1)非模板类型:

#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;

class Math
{
public:
    int Minus(int i, int j)
    {
        return i - j;
    }
};

int main()
{
    Math m;
    function<int(int, int)> f = std::bind(&Math::Minus, &m, placeholders::_1, placeholders::_2);
    cout << f(1, 2) << endl;

    system("pause");
    return 0;
}

  2)模板类型:

#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;

class Math
{
public:
    template<typename T>
    T Minus(T i, T j)
    {
        return i - j;
    }
};

int main()
{
    Math m;
    function<int(int, int)> f = std::bind(&Math::Minus<int>, &m, placeholders::_1, placeholders::_2);
    cout << f(1, 2) << endl;

    system("pause");
    return 0;
}

 

posted @ 2020-10-17 16:10  zwj鹿港小镇  阅读(115)  评论(0编辑  收藏  举报