[클래스 함수 콜백] c++11 의 functional 과 QT 의 connect 비교




c# 의 Deletgate 문법을 이용한 간단한 콜백을 연구해왔다. 역시나 c# 만큼 간단하게 표현될수는 없을것 같지만, static 함수가 아닌 클래스 함수로 콜백을 연결 할 수 있는 방법을 찾았다.



* 관련 포스트 참고

http://yamecoder.tistory.com/283

http://yamecoder.tistory.com/288


* 참고 포스트

http://plming.tistory.com/59






QT 스타일의 connect 를 이용한 콜백 구현

장점 : QT 개발 환경과 호환성

단점 : 상대적으로 코딩량이 많고 , 무조건 QObject 를 상속 해야 한다. c++ 표준이 아닌 키워드를 사용해야 한다. 

#include <QObject>
#include <QDebug>

//signal 신호(이벤트 생성)를 발생 시킴.
class QSignalClass : public QObject
{
    Q_OBJECT
signals:
    void CallbackSignal(int a , QString str);

public:

    void CreateSignal()
    {
        for(int i = 0 ; i < 3 ; i ++)
            emit CallbackSignal(i , "str");
    }
};



//call 신호를 호출하고 수신을 대기함 (이벤트 핸들러)
class QCallClass : public QObject
{
    Q_OBJECT
public slots:
    void Handler(int a , QString str)
    {
        qDebug() << "QT Callback  : " << a << "str : " << str;
    }

public:
    QSignalClass signal;

    void Excute()
    {
        signal.CreateSignal();
    }


    //최초, 이벤트 등록 절차 ( connect ) 가 필요함.
    explicit QCallClass(QObject *parent = 0)
        :QObject(parent)
    {
        connect(&signal , SIGNAL(CallbackSignal(int , QString)) , this , SLOT(Handler(int , QString)));
    }
};






C++11 스타일의 functional을 이용한 콜백 구현 

장점 : 코딩량이 적고 표준 표현법이다.

단점 : 다른 QT 컴포넌트와 같이 사용할때, 상대적으로 편리함은 떨어질 수 있다.

#include <QDebug>
#include <functional>


//signal 신호(이벤트 생성)를 발생 시킴
//pro 파일에 CONFIG += c++11 을 해야 functional 과 관련된 키워드를 사용 할 수 있음

using namespace std;
class CSignalClass
{

public:
    typedef function<void(int , QString)> signalCallbackType;

    void CreateSignal(signalCallbackType f)
    {
        for(int i = 0 ; i < 3 ; i ++)
            f(i , "str");
    }

};


//call 신호를 호출하고 수신을 대기함 (이벤트 핸들러)
class CCallClass
{
public:
    CSignalClass signal;

    void Handler(int a , QString str)
    {

        qDebug() << "C Callback : " << a << "str : " << str;
    }

    void Excute()
    {
        signal.CreateSignal(
                    bind(&CCallClass::Handler,this , placeholders::_1 , placeholders::_2)
                    );
    }
};



활용

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QCallClass qt_obj;
    qt_obj.Excute();

    qDebug() << "========================";

    CCallClass c_obj;
    c_obj.Excute();

    return a.exec();
}



출력

QT Callback : 0 str : "str"

QT Callback : 1 str : "str"

QT Callback : 2 str : "str"

========================
C Callback : 0 str : "str"

C Callback : 1 str : "str"

C Callback : 2 str : "str"





두 방법 모두 정상적으로 출력이 되었다.

하지만 functional 을 이용한 방법을 더 선호 하게 되었다. 콜백 포인터를 객체 처럼 관리가 가능 할듯 하여 이전에 구상한 이벤트모델에 적용이 가능 할것 같다.




edit (15-10-05) 

참고글 : 


https://github.com/jwvg0425/ProjectArthas/wiki/%ED%95%A8%EC%88%98-%ED%8F%AC%EC%9D%B8%ED%84%B0-%EA%B0%9C%EB%85%90%EB%B6%80%ED%84%B0-std::function%EA%B9%8C%EC%A7%80



http://la-stranger.tistory.com/entry/stdbind-사용하기

Yamecoder 야매코더_
tags : ,
C++(Qt) 2015.10.01 12:35
Powerd by Tistory, designed by criuce
rss