c++11 Lambda 를 이용한 c# 스타일의 콜백 구현 하기




c# 에서 아주 간단한 콜백을 구현 하는 방법중 아래와 같은 표현이 있다.

delegate void callbackType(int a); private void CallbackFunc(callbackType callback) { callback(123); } public Program() { CallbackFunc(delegate(int a) { Console.WriteLine("callback : " + a); }); }


간단히 delegate 를 선언하고 그 형식에 맞는 함수를 대입 하거나 혹은 매개변수 자리에 바로 작성이 가능하여 아주 컴팩트한 콜백 수신이 가능하다.

아주 즐겨 사용하는 방법이다.



그리고 이러한 표현을 c++ 에도 사용하고 싶어 여러가지 노력을 하였다.

http://yamecoder.tistory.com/283

http://yamecoder.tistory.com/288

http://yamecoder.tistory.com/322


그중 가장 간편한 방법은 functional 을 이용한 bind 방식이다. 장점은 클래스 함수로 바로 호출이 간으 하다.

하지만 코딩이 길고, 여전히 c# 의 그것과 같은 컴팩트함은 불가능 하다. 


하지만 c++11 람다를 이용하면 가능하다.


#include <QCoreApplication> #include <QDebug> class UpdateClass { public: template<typename Function> void UpdateValue(Function callbackLambda) { callbackLambda("this is anonymous updated callback values" , 1 , 30.2f); } }; int main(int argc, char *argv[]) { //기본적인 람다 함수 사용법 auto Simplelambda = [](int a , int b) { int c = a + b; qDebug() << "Simple lambda result : " << c; }; auto Landafunc1 = static_cast<void(*)(int , int)>(Simplelambda);
Landafunc1(1,2); //혹은 바로 호출

Simplelambda(3,2); //클래스에서 바로 호출 하는 람다 콜백 사용법 UpdateClass updateObj; updateObj.UpdateValue([](char* str, int v1, float v2){ qDebug() << str; qDebug() << "v1: " << v1 << ", v2: " << v2; }); QCoreApplication a(argc, argv); return a.exec(); }





추가 > 람다를 이용하여 간단한 쓰레드 구성 하기

#include <thread>
#include <QDebug>

class LambdaWidthThread
{

private :
    int value1;

public :

    int Add(int a , int b)
    {
        return a + b;
    }

    void RunThread(int q , int w)
    {
        value1 = q * w;


        /*
         * 람다식의 [...] 안에 변수를 넘기면 본문에서 사용이 가능하다.
         *
         * 대표적으로 this 참조를 넘기면 클래스 접근이 가능하고 직접(q,w) 를 넘겨도 사용이 가능하다.
         * 물론 thread arg (e) 역시 사용이 가능하다.
         * */

        auto t = std::thread([this , q , w](int e){

            qDebug() << "access member vars : " << this->value1;
            qDebug() << "access member function : " << this->Add(10,20);
            qDebug() << "access capture vars : " << q << "," << w;
            qDebug() << "access thread args : " << e;

        } , q+w);

        t.join();
    }

};


int main(int argc, char *argv[])
{
    LambdaWidthThread obj;
    obj.RunThread(2,3);

}



참고 : http://meh.schizofreni.co/programming/magic/2013/01/23/function-pointer-from-lambda.html

Yamecoder 야매코더_
C++(Qt) 2015.10.04 23:22
Powerd by Tistory, designed by criuce
rss