2011-01-19 2 views
2

"Accelerated C++"책을 통해 작업 중이며 연습 문제 중 하나에서 헤더의 'equal'함수를 에뮬레이션해야하며 지금까지 다음과 같은 세 가지 매개 변수를 사용하는 간단한 버전을 구현했습니다.'동일'템플릿 기능은 어떻게 구현됩니까? (술어 버전)

template <class iterType1, class iterType2> 
bool cequal(iterType1 begin, iterType1 end, iterType2 e){ 

    while(begin != end){ 
     if(!(*begin == *e)) 
      return false; 
     ++begin; 
     ++e; 
    } 
    return true; 
} 

및 제 4 매개 변수를 받아 들일 수 두 번째 버전 ...

template <class iterType1, class iterType2, class boolPred> 
bool cequal(iterType1 begin, iterType1 end, iterType2 e, boolPred pred){ 

    while(begin != end){ 
     if(!pred(*begin, *e)) 
      return false; 
     ++begin; 
     ++e; 
    } 
    return true; 
} 

내 질문이 그것을 할 수있는 이상적인 방법입니다? 또는이 두 함수가 병합 할 수 있습니까?

답변

3

첫 번째 버전은 equal_to 개체를 마지막 매개 변수로 전달하여 두 번째 버전을 호출 할 수 있습니다. 아니면 그냥 기본 매개 변수로 설정할 수 있습니다. 나는 그것을 뒤로 가져 간다. 함수 템플릿에 대한 기본 인수를 갖는 방법을 실제로 파악할 수는 없습니다. 심지어 C++ 0x 기능 (decltype)을 사용하지 않고도 과부하 솔루션에서 코드를 다시 사용하는 방법을 알 수 없습니다. 당신이 그들을 병합 할 경우

template <class iterType1, class iterType2> 
bool cequal(iterType1 begin, iterType1 end, iterType2 e){ 
    return cequal(begin, end, e, std::equal_to<decltype(*begin)>()); 
} 
+1

'equal_to'의 문제점은 2 개의 피연산자가 동일한 유형을 가지는 반면 그의 함수는 피연산자에 대해 2 개의 다른 유형이 있다고 예상한다는 것입니다. – Blindy

+0

@Blindy : 그의 함수는 iterators에 대해 다른 유형을 가지고 있지만 요소의 유형이 같지 않다는 것을 의미하지는 않습니다. 어쨌든 두 가지 유형을 비교하기는 어려울 것이라고 생각합니다. 시도하면 오류가 발생합니다. 나는 그것을 실제로 문제로 보지 않는다. 그것이 그가 원하는 것이라면 그는 물론 다른 기능을 사용할 수 있습니다. –

0

, 당신은 단지 입력에 operator==를 호출하는 마지막 매개 변수에 대한 기본 조건을 제공 할 수있다.

편집 : 예는 다음과 같습니다

template<typename T1, typename T2> 
struct eqpred 
{ 
    bool operator(T1 &a, T2 &b) { return a==b; } 
} 

template <class iterType1, class iterType2, class boolPred=eqpred> 
bool cequal(iterType1 begin, iterType1 end, iterType2 e, boolPred pred){ 

    while(begin != end){ 
     if(!pred(*begin, *e)) 
      return false; 
     ++begin; 
     ++e; 
    } 
    return true; 
} 
+0

그것에 대해 생각했지만 기본 매개 변수를 == 연산자로 설정하는 구문을 모르겠다 – Moin

+0

@Moin, 예제로 업데이트되었습니다. – Blindy

+0

이 작업이 가능합니까? 이것은 마지막 인자로 'boolPred'를 명시 적으로 전달해야하며, IIRC에서는 함수 템플릿에서 기본 인수를 줄 수 없습니다. – templatetypedef

0

이 두 기능은 단지 병합 가능하지, 그들은 거의 정확하게 라인 같은 라인입니다.

나는 당신을 위해 그것을 확장하고 다 할 수 있지만, 그것은 약간의 스포일러가 될 것입니다.

관련 문제