码迷,mamicode.com
首页 > 其他好文 > 详细

std::function

时间:2020-10-18 09:56:03      阅读:18      评论:0      收藏:0      [点我收藏+]

标签:cout   turn   code   一个   clu   minus   指定   include   表达式   

一、类模板说明

std::function是一个函数包装器模板,最早来自boost库,对应其boost::function函数包装器。在c++0x11中,将boost::function纳入标准库中。该函数包装器模板能包装任何类型的可调用元素(callable element),例如普通函数和函数对象。包装器对象可以进行拷贝,并且包装器类型仅仅只依赖于其用特征(call signature),而不依赖于可调用元素自身的类型。

一个std::function类型对象实例可以包装下列这几种可调用元素类型:函数、函数指针、类成员函数指针或任意类型的函数对象(例如定义了operator()操作并拥有函数闭包)。std::function对象可被拷贝和转移,并且可以使用指定的调用特征来直接调用目标元素。当std::function对象未包裹任何实际的可调用元素,调用该std::function对象将抛出std::bad_function_call异常

二、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;
}

 

std::function

标签:cout   turn   code   一个   clu   minus   指定   include   表达式   

原文地址:https://www.cnblogs.com/zwj-199306231519/p/13831581.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!