介绍
类模板std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标尸体进行存储、复制和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针以及其它函数对象等。std::function对象是对C++中国呢现有的可调用实体的一种类型安全的包裹(std::function就是对标函数指针类型不安全的可调用实体而实现的)。
封装普通函数例子
#ifndef TEST_H
#define TEST_H
#include <iostream>
#include <functional>
int add(int a, int b);
#endif
#include "test.h"
std::function<int(int, int)> func = add;
std::function<int(int, int)> func1 = [](int a, int b) {return a+b;};
int main()
{
std::cout << "func(1, 2): " << func(1, 2) << std::endl;
std::cout << "func1(4, 5): " << func1(4, 5) << std::endl;
return 0;
}#endif
封装仿函数例子
#ifndef TEST_H
#define TEST_H
#include <iostream>
#include <functional>
typedef std::function<int(int)> Functornal;
class Functor{
public:
int operator()(int a) {
return a;
}
};
#endif
#include "test.h"
int main()
{
//1.1 fucntor
Functor func;
Functornal fobj = func;
int fres = fobj(3);
std::cout << "functor fres: " << fres << std::endl;
return 0;
}
封装类成员函数和类静态成员函数例子
#ifndef TEST_H
#define TEST_H
#include <iostream>
#include <functional>
typedef std::function<int(int, int)> Functional;
typedef std::function<const char*(const char*)> SFunctional;
class CTest{
public:
int Func(int a, int b) {
return a+b;
}
static const char *S_Func(const char* s) {
return s;
}
};
#endif
#include "test.h"
int main()
{
//1.2 bind
CTest t;
Functional obj = std::bind(&CTest::Func, &t, std::placeholders::_2, std::placeholders::_2);
int res = obj(3,5);
std::cout << "member function: " << res << std::endl;
//1.3 static bind
SFunctional sobj = std::bind(&CTest::S_Func, std::placeholders::_1);
const char* sres = sobj("nihao");
std::cout << "member function1: " << sres << std::endl;
//1.4 common function use
SFunctional sobj1 = CTest::S_Func;
const char* sres1 = sobj1("hello world.");
std::cout << "member function2: " << sres1 << std::endl;
return 0;
}