#include<iostream>
#include<functional>
using namespace std;
using namespace std::placeholders;
//函数
int half(int x) {return x/2;}
//仿函数
struct third_t {
int operator()(int x) {return x/3;}
};
//结构体
struct MyValue {
int value;
int fifth() {return value / 5;}
};
double my_divide (double x, double y) {return x/y;}
int main()
{
function<int(int)> fn1 = half;
function<int(int)> fn2 = ½
function<int(int)> fn3 = third_t();
function<int(int)> fn4 = [](int x){return x /4;}; //lambda
function<int(int)> fn5 = negate<int>();
std::cout << "fn1(60): " << fn1(60) << '\n';
std::cout << "fn2(60): " << fn2(60) << '\n';
std::cout << "fn3(60): " << fn3(60) << '\n';
std::cout << "fn4(60): " << fn4(60) << '\n';
std::cout << "fn5(60): " << fn5(60) << '\n';
cout << "(*fn1.target<int(*)(int)>())(100) = " << (*fn1.target<int(*)(int)>())(100)<< endl;
//target() 成员函数的作用是:Returns a pointer to the callable object stored in the function object.
std::function<int(MyValue&)> value = &MyValue::value; // 指向数据成员的指针
std::function<int(MyValue&)> fifth = &MyValue::fifth; // 指向成员函数的指针
MyValue sixty {60};
std::cout << "value(sixty): " << value(sixty) << '\n';
std::cout << "fifth(sixty): " << fifth(sixty) << '\n';
cout << "===============================" << endl;
auto fn6 = bind(my_divide, _1, _2);
auto fn7 = bind(my_divide, _2, _1);
auto fn8 = bind(my_divide, _1, 3);
cout << "fn6(10,5) = " << fn6(10,5) <<endl;
cout << "fn7(10,5) = " << fn7(10,5) <<endl;
cout << "fn8(12) = " << fn8(12) <<endl;
return 0;
}