C++11新特性:std::function使用详解
1、说明
std::function是一个函数包装模板,可以包装下列这几种可调用元素类型:函数、函数指针、类成员函数指针或任意类型的函数对象(例如定义了operator()操作并拥有函数闭包)。std::function对象可被拷贝和转移,并且可以使用指定的调用特征来直接调用目标元素。当std::function对象未包裹任何实际的可调用元素,调用该std::function对象将抛出std::bad_function_call异常。
2、使用场景
2.1 普通函数
#include <iostream>
#include <functional>
using namespace std;
int m_scan(int i, int j)
{
return i - j;
}
int main() {
function<int(int, int)> m = m_scan;
cout << m(6, 3);
return 0;
}
2.2 模板函数
#include <iostream>
#include <functional>
using namespace std;
template <class T>
T m_scan(T i, T j)
{
return i - j;
}
int main() {
function<int(int, int)> m = m_scan<int>;
cout << m(6, 3);
return 0;
}
2.3 lambda表达式
#include <iostream>
#include <functional>
using namespace std;
auto m_scan = [](int i, int j) {return i - j; };
int main() {
function<int(int, int)> m = m_scan;
cout << m(6, 3);
return 0;
}
2.4 结构体成员函数
#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;
return 0;
}
#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;
return 0;
}
2.5 类静态成员函数
#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;
return 0;
}
#include <iostream>
#include <functional>
using namespace std;
class Math
{
public:
template <class 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; // -1
return 1;
}
2.6 类对象成员函数
#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 = bind(&Math::Minus, &m, placeholders::_1, placeholders::_2);
cout << f(1, 2) << endl;
return 1;
}
#include <iostream>
#include <functional>
using namespace std;
class Math
{
public:
template <class T>
T Minus(T i, T j)
{
return i - j;
}
};
int main()
{
Math m;
function<int(int, int)> f = bind(&Math::Minus<int>, &m, placeholders::_1, placeholders::_2);
cout << f(1, 2) << endl;
return 1;
}