3、可调用对象包装器(std::function)
一、可调用对象包装器:
std::function是可调用对象的包装器。它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指针,并允许保存和延迟执行它们。
二、基本用法:
(1)包装普通函数
#include "stdafx.h" #include<iostream> #include<functional> using namespace std; int g_Minus(int i, int j) { return i - j; } int main() { function<int(int, int)> f = g_Minus; cout << f(1, 2) << endl; system("pause"); return 0; }
(2)包装模板函数
#include "stdafx.h" #include<iostream> #include<functional> using namespace std; template<typename T> T g_Minus(T i, T j) { return i - j; } int main() { function<int(int, int)> f = g_Minus<int>; cout << f(1, 2) << endl; system("pause"); return 0; }
(3)包装lambda表达式
#include "stdafx.h" #include<iostream> #include<functional> using namespace std; auto g_Minus = [](int i, int j){return i - j; }; int main() { function<int(int, int)> f = g_Minus; cout << f(1, 2) << endl; system("pause"); return 0; }
(4)包装函数对象
1)非模板类型:
#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; // -1 return 1; }
2)模板类型:
#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; // -1 return 1; }
(5)包装类静态成员函数
1)非模板类型:
#include "stdafx.h" #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; system("pause"); return 0; }
2)模板类型:
#include "stdafx.h" #include<iostream> #include<functional> using namespace std; class Math { public: template <typename 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; system("pause"); return 0; }
(6)包装类对象成员函数
1)非模板类型:
#include "stdafx.h" #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 = std::bind(&Math::Minus, &m, placeholders::_1, placeholders::_2); cout << f(1, 2) << endl; system("pause"); return 0; }
2)模板类型:
#include "stdafx.h" #include<iostream> #include<functional> using namespace std; class Math { public: template<typename T> T Minus(T i, T j) { return i - j; } }; int main() { Math m; function<int(int, int)> f = std::bind(&Math::Minus<int>, &m, placeholders::_1, placeholders::_2); cout << f(1, 2) << endl; system("pause"); return 0; }
111