#include <QCoreApplication>
#include <functional>
#include <iostream>
using namespace std;
void print()
{
std::cout << "here is print" <<'\n';
}
void print_num(int i)
{
std::cout << i << '\n';
}
void print_add(int i, int j)
{
std::cout << i+j << '\n';
}
class Foo
{
public:
Foo(int data)
{
m_data = data;
}
void print_sum(int n1, int n2)
{
std::cout << n1 + n2 << std::endl;
}
int m_data;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
using namespace std::placeholders;
//-------------------------------------------------------
//调用void print()函数
//1.不使用std::bind
std::function<void()> f = print;
f();
//2.使用std::bind
std::function<void()> f_bind = std::bind(print);
f_bind();
//调用void print_num(int i)函数
//1.不使用std::bind
std::function<void(int)> ff = print_num;
ff(12345);
//2.使用std::bind
std::function<void()> ff_bind = std::bind(print_num, 12345);
ff_bind();
//调用void print_adds(int i, int j)函数
//1.不使用std::bind
std::function<void(int,int)> fff = print_add;
fff(1,2);
//2.使用std::bin
std::function<void()> fff_bind = std::bind(print_add, 1,2);
fff_bind();
//-------------------------------------------------------
// 绑定指向成员函数指针
//使用auto自动推导数据类型
Foo *foo = new Foo(20);
std::function<void()> f1 = std::bind(&Foo::print_sum, foo, 95, 4);
f1();
std::function<void(int)> f2 = std::bind(&Foo::print_sum, foo, 95, _1);
f2(5);
auto f3 = std::bind(&Foo::print_sum, foo, 95, 6);
f3();
auto f4 = std::bind(&Foo::print_sum, foo, 95, _1);
f4(7);
return a.exec();
}