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