使用方法:就是当作函数指针或回调函数使用,起到统一标准的作用,
可接收参数包括:std::function可接收"全局函数、static成员函数、成员函数、lamda表达式"
std::function作全局变量
std::function作成员变量
1.接收函数
【
(1)接收全局函数
[
#include <functional>
typedef std::function<void(int, int)> callback;
void fun(int n1, int n2)
{
OutputDebugString(L"fun");
}
使用:
callback func = fun;
func(1,2);
]
---
(2)接收static成员函数
[
#include <functional>
typedef std::function<void(int, int)> callback;
class CTest
{
public:
CTest()
{
}
~CTest()
{
}
void test_fun(int n1, int n2)
{
OutputDebugString(L"test_fun");
}
static void static_test_fun(int n1, int n2)
{
OutputDebugString(L"static_test_fun");
}
};
使用:
callback func4 = CTest::static_test_fun;
func4(1,2);
]
---
(3)接收成员函数
[
#include <functional>
typedef std::function<void(int, int)> callback;
class CTest
{
public:
CTest()
{
}
~CTest()
{
}
void test_fun(int n1, int n2)
{
OutputDebugString(L"test_fun");
}
static void static_test_fun(int n1, int n2)
{
OutputDebugString(L"static_test_fun");
}
};
使用:
CTest test;
callback func5 = [&](int n1, int n2) {test.test_fun(n1, n2); };//方式1:lamda表达式方式
func5(1,2);
callback func6 = std::bind(&CTest::test_fun, &test, std::placeholders::_1, std::placeholders::_2);//方式2:std::bind方式
func6(1, 2);
]
---
(4)接收lamda表达式
[
#include <functional>
typedef std::function<void(int, int)> callback;
使用:
callback func3 = [](int n1, int n2) {OutputDebugString(L"lamda_fun"); };
func3(1,2);
]
】
--------------------------------------------------------------------
2.作为函数形参
【
作为函数形参时,当函数指针使用,传入参数可以是:全局函数、static成员函数、成员函数、lamda表达式(就是上面说的接收的那些)
class CTest2
{
public:
CTest2()
{
}
~CTest2()
{
}
void RegisterCallback(callback call)
{
m_call = std::move(call);
}
void Call_test()
{
if (m_call)
{
m_call(1, 2);
}
}
private:
callback m_call;
};
class CTest3
{
public:
CTest3()
{
}
~CTest3()
{
}
void Init()
{
m_test2.RegisterCallback([this](int n1, int n2) { this->test3_fun(1, 2); });
//m_test2.RegisterCallback(std::bind(&CTest3::test3_fun, this, std::placeholders::_1, std::placeholders::_2));
}
void test3_fun(int n1, int n2)
{
OutputDebugString(L"test3_fun");
}
CTest2 m_test2;
};
使用:
CTest3 dlg;//假设CTest3是个对话框,CTest2是个子控件
dlg.init();
dlg.DoModal();
当CTest2中Call_test()被调用,最终CTest3的test3_fun()函数就会收到
】
----------------------------------------------------------------
3.作为返回值
【
#include <functional>
typedef std::function<void(int, int)> callback;
void fun(int n1, int n2)
{
OutputDebugString(L"fun");
}
callback getfunc()
{
callback ff = fun;
return ff;
}
使用:
callback ff = getfunc();
ff(1,2);
】
-------------------------------------------------------------------------
完整代码:
【
#include <iostream>
#include <functional>
typedef std::function<void(int, int)> callback;
void fun(int n1, int n2)
{
OutputDebugString(L"fun");
}
class CTest
{
public:
CTest()
{
}
~CTest()
{
}
void test_fun(int n1, int n2)
{
OutputDebugString(L"test_fun");
}
static void static_test_fun(int n1, int n2)
{
OutputDebugString(L"static_test_fun");
}
};
class CTest2
{
public:
CTest2()
{
}
~CTest2()
{
}
void RegisterCallback(callback call)
{
m_call = std::move(call);
}
void Call_test()
{
if (m_call)
{
m_call(1, 2);
}
}
private:
callback m_call;
};
class CTest3
{
public:
CTest3()
{
}
~CTest3()
{
}
void Init()
{
m_test2.RegisterCallback([this](int n1, int n2) { this->test3_fun(1, 2); });
//m_test2.RegisterCallback(std::bind(&CTest3::test3_fun, this, std::placeholders::_1, std::placeholders::_2));
}
void test3_fun(int n1, int n2)
{
OutputDebugString(L"test3_fun");
}
CTest2 m_test2;
};
callback getfunc()
{
callback ff = fun;
return ff;
}
void CMFCApplication7Dlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//CDialogEx::OnOK();
//全局变量
callback func = fun;
func(1,2);
auto fun2 = fun;
fun2(1, 2);
//lamda
callback func3 = [](int n1, int n2) {OutputDebugString(L"lamda_fun"); };
func3(1,2);
//static成员函数
callback func4 = CTest::static_test_fun;
func4(1, 2);
//成员函数
CTest test;
callback func5 = [&](int n1, int n2) {test.test_fun(n1, n2); };
func5(1, 2);
callback func6 = std::bind(&CTest::test_fun, &test, std::placeholders::_1, std::placeholders::_2);
func6(1, 2);
//返回值
callback ff = getfunc();
ff(1,2);
}
】
----------------------------------------------------------------------
一个例子:响应slider位置变化
实现方法:
[
头文件添加:
#include <functional>
typedef std::function<void(WPARAM, LPARAM)> CallBack_SliderPosChange;
class CDrawSlider
{
public:
//注册位置变化回调
void RegisterCallbackSliderPosChange(CallBack_SliderPosChange callback);
private:
CallBack_SliderPosChange m_callbackSliderPosChange;//成员变量
}
cpp文件:
void CDrawSlider::RegisterCallbackSliderPosChange(CallBack_SliderPosChange callback)
{
m_callbackSliderPosChange = std::move(callback);
}
调用回调函数直接用:m_callbackSliderPosChange((WPARAM)clrValue1, (LPARAM)clrValue2);
---
使用方法:
头文件:
class CTest
{
public:
//滑块位置变化响应
void OnSliderPosChanger(WPARAM wparam, LPARAM lparam);
private:
CDrawSlider m_slider;
}
cpp:
m_slider.RegisterCallbackSliderPosChange([this](WPARAM wparam, LPARAM lparam) {this->OnSliderPosChanger(wparam, lparam); });
//m_pSliderCtrl->RegisterCallbackSliderPosChange(std::bind(&ElementHeatMap::OnSliderPosChanger, this, std::placeholders::_1, std::placeholders::_2));
void CTest::OnSliderPosChanger(WPARAM wparam, LPARAM lparam)
{
m_ValueLeft = (COLORREF)wparam;
m_ValueRight = (COLORREF)lparam;
}
]