예전 자유 게시판

[re] 소스코드 올립니다~

(안녕하세요 ~ 궁금한게 있어서 하나 올립니다에 대한 답글입니다.)

송정헌 2011-03-26 01:03

올려놨던 소스를 수정해서

콘솔 환경에서 실행 할 수 있게 수정을 해놨습니다

IUtility.h,  IUtility.cpp , main.cpp 이렇게 새개 구요

다시 정리 하자면 질문은 총 두가지 인데요.

질문.1

시도하고 싶은 것은 find_if_equal_to_SecondArg  함수템플릿에서

template<typename _containerTy,typename Ty>
vecTuple2::iterator find_if_equal_to_SecondArg(_containerTy& container,Ty& arg1);

반환 타입을 vecTuple2::iterator 이렇게 타입을 지정해 놨는데요
이 것을 _containerTy 로 넘어온 컨테이너의 iterator 로 지정 할 수 있는지에 대한 것과


질문.2

Ty& arg1 즉 Ty 타입과 일치한는 vector<tuple<Arg0,Arg1,Arg2,,,,ArgN> >
Tuple 의 타입중 Ty 와 동일한 것을 find_if 구문에서 찾아내서 해당 vector 원소의 iterator 를
반환 하려고 하는 것입니다.
for문을 따로 쓰지 않고 메타프로그래밍에서 끝낼 수 있는건지 있다면 어떻게 하면 될지에 대한

조언을 구하고자 합니다

부탁 드립니다~^^

p.s 표준 라이브러리 확장책을 볼때마다 느끼지만 이 책에 대한 번역이본이 있어 많은 도움이
      되어 감사한 마음을 전하고 싶네요^^
      


//////
아래 코드는
Visual studio 2008 & SP1 이 설치된 버전에서 컴파일완료된 소스 입니다.

/////////////////////////////////////////////////////////////////////////////////////
// IUtility.h
/////////////////////////////////////////////////////////////////////////////////////

#include <Windows.h>
#include <iostream>

#include <WTypes.h>

#include <atltypes.h>

#include <tuple>
#include <vector>
#include <memory>
#include <typeinfo>

#include <algorithm>
#include <functional>


typedef std::tr1::tuple<POINT,int> tuple2;
typedef std::vector<tuple2 > vecTuple2;

POINT operator+(const POINT& lpt,const POINT& rpt);
POINT operator-(const POINT& lpt,const POINT& rpt);

void operator+=(POINT& lpt,const POINT& rpt);
void operator-=(POINT& lpt,const POINT& rpt);


bool operator==(const POINT& pointl,const POINT& pointr);


bool operator==( const  tuple2& ltup,const tuple2& rtup );

//////////////////////////////////////////////////////////////////////////


template<typename T>
bool signT(T x){
        return x >= 0 ? true : false;
}

template<typename _containerTy,typename Ty>
vecTuple2::iterator find_if_equal_to_SecondArg(_containerTy& container,Ty& arg1)
{
        typedef _containerTy::value_type tuple2Type;

        POINT tempPt={0,0};
        tuple2Type testttt = tuple2Type(tempPt,arg1);

        return std::find_if(
                container.begin(),container.end(),std::tr1::bind(
                std::equal_to<tuple2Type >()
                                                
                                                ,std::tr1::placeholders::_1,
                                                testttt
                                                ));
}


template<typename _containerTy,typename Ty>
vecTuple2::iterator find_if_equal_to(_containerTy& container,Ty& arg0)
{
        POINT tempPt={0,0};
        
        _containerTy::value_type testttt = _containerTy::value_type(tempPt ,3 ) ;
        return std::find_if(container.begin(),container.end(),std::tr1::bind(std::equal_to<Ty>(),std::tr1::placeholders::_1,arg0 ));
}


/////////////////////////////////////////////////////////////////////////////////////
// IUtility.cpp
/////////////////////////////////////////////////////////////////////////////////////


#include "IUtility.h"


using std::tr1::get;


POINT operator+(const POINT& lpt,const POINT& rpt){
        POINT tempPt={lpt.x+rpt.x,lpt.y+rpt.y};
        return tempPt;
}


POINT operator-(const POINT& lpt,const POINT& rpt){
        POINT tempPt={lpt.x-rpt.x,lpt.y-rpt.y};
        return tempPt;
}

void operator+=(POINT& lpt,const POINT& rpt){
        lpt.x+=rpt.x;
        lpt.y+=rpt.y;
}

void operator-=(POINT& lpt,const POINT& rpt){
        lpt.x-=rpt.x;
        lpt.y-=rpt.y;
}

bool operator==(const POINT& pointl,const POINT& pointr){
        return pointl.x==pointr.x && pointl.y==pointr.y;
}


bool operator==( const  tuple2& ltup, const tuple2& rtup ) {
        return get<0>(ltup).x ==  get<0>(rtup).x && get<0>(ltup).y ==  get<0>(rtup).y;
}


//////////////////////////////////////////////////////////////////////////////////////
//main.cpp
//////////////////////////////////////////////////////////////////////////////////////

#include <iostream>

using namespace std;

#include "IUtility.h"

//typedef std::tr1::tuple<POINT,int> tuple2;
//typedef std::vector<tuple2 > vecTuple2;


int main(){


        vecTuple2 vect2;

        tuple2 t1;
        POINT tempPt={0,0};
        t1 =std::pair<POINT,int>(tempPt,0);
        vect2.push_back( t1 );

        POINT tempPt1={1,0};
        t1 =std::pair<POINT,int>(tempPt1,0);
        vect2.push_back( t1 );

        find_if_equal_to(vect2,t1);

        int testi=3;
        find_if_equal_to_SecondArg(vect2,testi);


        return 0;
}


류광 2011-03-26 16:03


일단 눈으로만 보고 생각나는 걸 말씀드릴게요...

질문 1은 typename _containerTy::iterator 로 하면 될 겁니다. 의존적 형식이라서 typename이 꼭 필요합니다.

질문 2는 .. find_if와 eqult_to 등의 명세를 구체적으로 살펴보면서 차근차근 풀어나가셔야 할 듯.. std::equal_to< tuple2Type > 은 곧 bool (const tuple2Type& l, const tuple2Type& r)이고 그냥 l == r 을 돌려줄 뿐입니다. l == r 이 아니라 std::get<1>(l) == std::get<1>(r) 을 돌려주는 함수 객체를 만들 수 있느냐가 관건인 것 같은데 저도 한 번 고민해 보겠습니다.

송정헌 2011-03-26 17:03


음... std::get<1>(l) == std::get<1>(r) 의 함수 객체쪽으로 가야만 하는 것인가보군요
함수템플릿으로만 그냥 끝낼 수는 힘들겠지요?
1.번은 typename 의 좀 더 정확한 의미를 알 수 있었던거 같네요