【c++11】std::funciton使用


使用方法:就是当作函数指针或回调函数使用,起到统一标准的作用,
可接收参数包括: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;
}

]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值