菜鸟笔记
提升您的技术认知

std::function详解-ag真人游戏

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

看代码可以理解更快:

  • 包装普通函数
#include 
#include 
using namespace std;
int g_minus(int i, int j)
{
  
    return i - j;
}
int main()
{
  
    function f = g_minus;
    cout << f(1, 2) << endl;                                            // -1
    return 1;
}
  • 包装模板函数
#include 
#include 
using namespace std;
template 
t g_minus(t i, t j)
{
  
    return i - j;
}
int main()
{
  
    function f = g_minus;
    cout << f(1, 2) << endl;                                            // -1
    return 1;
}
  • 包装lambda表达式
#include 
#include 
using namespace std;
auto g_minus = [](int i, int j){
   return i - j; };
int main()
{
  
    function f = g_minus;
    cout << f(1, 2) << endl;                                            // -1
    return 1;
}
  • 包装函数对象

非模板类型

#include 
#include 
using namespace std;
struct minus
{
  
    int operator() (int i, int j)
    {
  
        return i - j;
    }
};
int main()
{
  
    function f = minus();
    cout << f(1, 2) << endl;                                            // -1
    return 1;
}

模板类型:

#include 
#include 
using namespace std;
template 
struct minus
{
  
    t operator() (t i, t j)
    {
  
        return i - j;
    }
};
int main()
{
  
    function f = minus();
    cout << f(1, 2) << endl;                                            // -1
    return 1;
}

- 包装类静态成员函数

非模板类型

#include 
#include 
using namespace std;
class math
{
  
public:
    static int minus(int i, int j)
    {
  
        return i - j;
    }
};
int main()
{
  
    function f = &math::minus;
    cout << f(1, 2) << endl;                                            // -1
    return 1;
}

模板类型:

#include 
#include 
using namespace std;
class math
{
  
public:
    template 
    static t minus(t i, t j)
    {
  
        return i - j;
    }
};
int main()
{
  
    function f = &math::minus;
    cout << f(1, 2) << endl;                                            // -1
    return 1;
}
  • 包装类对象成员函数

非模板类型:

#include 
#include 
using namespace std;
class math
{
  
public:
    int minus(int i, int j)
    {
  
        return i - j;
    }
};
int main()
{
  
    math m;
    function f = bind(&math::minus, &m, placeholders::_1, placeholders::_2);
    cout << f(1, 2) << endl;                                            // -1
    return 1;
}

模板类型:

#include 
#include 
using namespace std;
class math
{
  
public:
    template 
    t minus(t i, t j)
    {
  
        return i - j;
    }
};
int main()
{
  
    math m;
    function f = bind(&math::minus, &m, placeholders::_1, placeholders::_2);
    cout << f(1, 2) << endl;                                            // -1
    return 1;
}
网站地图