/*     오버로드 된 멤머 함수를 컨넥시 오류 나는 부분~     */
// 태인이형 알려주셔서 캄샤캄샤~

struct stFunc
{
     void Display() {
           // to do
     }
     void Display_text( const char* pszText ) const {
           // to do
     }
     void Display_text() const {
           // to do
     }
};

boost::signal< void( stFunc*, const char* ) > sig01;
boost::signal< void( stFunc* ) > sig02;

stFunc* pFunc = new stFunc;

/*
* 일반적인 모양
*  sig01.connect( &stFunc::Display_text );
*  오버로드된 멤버 함수를 컨넥할 시
*  sig01.connect( static_cast< 리턴형( 구조체나 클래스명::*)( 인자 ) > ( 연결할 멤버함수의 주소 )
*/

sig01.connect( static_cast< void( stFunc::* )( const char* ) const > ( &stFunc::Display_text ) );
sig02.connect( static_cast< void( stFunc::* )() const > ( &stFunc::Display_text ) );

sig01( pFunc, "테스트 문자열" );
sig02( pFunc );

delete pFunc;

/*   멤버 함수를 호출해서 사용하는 법.    */
// 함수 오버로딩시 문제점 발생!  아직 미해결 ㅋ

struct stFunc
{
     void Display() {
           // to do
     }
     void Display_text( const char* pszText ) {
           // to do
     }
};

int main( int argc, char* argv[] )
{
    // 인자가 없는 함수와 있는 함수
    boost::signal< void( stFunc* ) > sig01;
    boost::signal< void( stFunc*, const char* ) > sig02;

    // 함수 뒤에 () 빠지는 것을 주의. 함수포인터만 필요함.
    sig01.connect( &stFunc::Display );
    sig02.connect( &stFunc::Display_text );

    stFunc* pFunc = new stFunc;

    sig01( pFunc );
    sig02( pFunc, "출력할 문장" );

    delete pFunc;

    return 0;
}

#include <boost/signal.hpp>

struct stFunc
{
    void operator() () const {
        // to do
    }
};

int main( int argc, char* argv[] )
{
    // boost::signal< 리턴형( parameter1, param2, ... paramN ) > 시그널변수이름;

    // 지금은 함수 자체에 인자가 없으므로 전부 void() 형으로 시그널 형성
    // 구조체( 클래스 ) 자체를 연결.
    boost::signal< void() > sig01;
    sig01.connect( stFunc() );
    sig01();

    // 할당된( 정적 or 동적 ) Object( struct or class )에 연결
    boost::signal< void() > sig02;
    boost::signal< void() > sig03;

    stFunc     Func;
    stFunc*    pFunc;

    sig02.connect( Func );
    sig03.connect( *pFunc );

    sig02();
    sig03();

    delete pFunc;
}

if( a == b == c )
{
}

의 결과는 무조건 false !!
( a == b ) 가 true / false 로 나오는데
그 값을 다시 c 와 비교하기 때문에
만약 c가 0이나 1이라면 우연찮게 true가 나올 가능성이 있다.
하지만 대부분 false가 나오겠지~

3개의 값이 똑같음을 비교하는건 귀찮지만 2개씩 비교해야 하나보다.
오늘 작업하면서 다른 사람이 짠 소스 였는데.
역시 매크로! 재밌다는걸 느꼈다.

#define DEFINE_OPTION_BOOL(NAME)   bool m_b##NAME##;
#define DEFINE_OPTION_BOOL_GETFUNC(NAME) inline const bool Can##NAME##() { return pSecured->m_b##NAME##; }
#define DEFINE_OPTION_INT(NAME)    int m_i##NAME##;
#define DEFINE_OPTION_INT_GETFUNC(NAME)  inline const int Get##NAME##() { return pSecured->m_i##NAME##; }

매크로를 쓴 이유는 기업비밀~!