#include <iostream>
#include <string>
#include <functional>
using namespace std;
class MyClass
{
public:
MyClass(){}
MyClass(int a): m_i(a){}
~MyClass(){}
void Get(int a, string str)
{
cout << a << " " << str << endl;
}
public:
int m_i;
};
// 绑定成员函数
void Test_Bind_Member_Func()
{
MyClass myclass(2);// std::placeholders::_1
std::function<void(int, string str)> m_fun = std::bind(&MyClass::Get, &myclass, 100, std::placeholders::_2); // 这里是封装的返回值是引用类型才可以修改类的成员函数
if (m_fun)
{
m_fun(111, "acb"); // 输出111 abc
}
}
// 一种特殊场景,可以绑定类的成员变量,可以通过函数调用的方式访问和修改它
// 可以修改的前提是,可调用对象封装器封装的函数返回值是引用类型
void Test_Bind_Member_Variable()
{
MyClass myclass(2);
std::function<int&(void)> m_v = std::bind(&MyClass::m_i,&myclass); // 这里是封装的返回值是引用类型才可以修改类的成员变量
if (m_v)
{
cout << "m_v: " << m_v() << endl;
m_v() = 3; // 相当于修改成员变量
cout << "m_v: " << m_v() << endl;
}
}
int TestFunc(int a, char c, float f)
{
cout << a << endl;
cout << c << endl;
cout << f << endl;
return a;
}
void Test()
{
auto bindFunc1 = bind(TestFunc, std::placeholders::_1, 'A', 100.1);
bindFunc1(10);
cout << "=================================\n";
auto bindFunc2 = bind(TestFunc, std::placeholders::_2, std::placeholders::_1, 100.1);
bindFunc2('B', 10);
cout << "=================================\n";
auto bindFunc3 = bind(TestFunc, std::placeholders::_2, std::placeholders::_3, std::placeholders::_1);
bindFunc3(100.1, 30, 'C');
}
int main()
{
Test_Bind_Member_Func(); // 绑定成员函数
Test_Bind_Member_Variable(); // 绑定成员变量
getchar();
return 0;
}