// MS C++ 2013
template class function;
template class function : public _Get_function_impl<_Fty>::type { ... }
// GCC 4.8.2
template class function;
template class function<_Res(_ArgTypes...)>
: public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>, private _Function_base { ... }// cplusplus.comtemplate function; // undefined
template class function;
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异常。
以cplusplus.com中描述的原型说明:
T : 通用类型,但实际通用类型模板并没有被定义,只有当T的类型为形如Ret(Args...)的函数类型才能工作。
Ret : 调用函数返回值的类型。
Args : 函数参数类型。
• 包装普通函数
#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;
}