2014-09-02 2 views
1

가속화 된 C++의 연습 문제를 해결하기 위해 노력하고 있으며 현재 제네릭 함수에 관한 장을 다루고 있습니다. 주어진 반복자의 value_type을 쓰고 싶었던 알고리즘을 발견했습니다. 나는 많은 도움이되는이 게시물 Default template arguments for function templates을 보았지만 나의 접근 방식이 올바른지 궁금합니다. 나는 그것이 사실 인 경우 나쁜 습관에 빠지기를 원하지 않습니다.함수 템플릿 : 기본 형식 매개 변수

template <class ForwardIt, class BinaryOp = std::greater<std::iterator_traits<ForwardIt>::value_type> > 

ForwardIt maxInRange(ForwardIt begin, ForwardIt end, BinaryOp op = BinaryOp()) { 
    // test here to reduce the loop count by 1 

    if (begin == end) 
     return begin; 

    ForwardIt largest = begin; 

    while (++begin != end) 
     if (op(*begin, *largest)) 
      largest = begin; 

    return largest; 
} 

하나 더 질문드립니다. BinaryOp 형식 매개 변수와 관련된 구문은 어떻게 작동합니까? 유형을 함수처럼 호출하는 것이 어떻게 대체 효과와 같은 효과를 만들어 내는지는 잘 모르겠습니다. 시간 내 줘서 고마워. 정말 감사.

+0

키는 '입니다. operator() (some args ...);' – user3159253

답변

2

BinaryOp op = BinaryOp()은 기본값으로 구성된 임시 인스턴스에서 BinaryOp의 인스턴스를 복사 초기화하는 중입니다. 기본 템플릿 인수는 std::greater이며 기본 유형은 BinaryOp입니다. 모든 클래스 유형에 ()을 사용하면 생성자 호출이 발생합니다. 이 코드에서 기본 매개 변수는 std::greater입니다.

다음으로 op()으로 전화를 걸면 실제로 회원 연산자 bool operator()(const value_type&, condt value_type&)이 호출됩니다. 이렇게하면 op이 함수 객체처럼 작동 할 수 있습니다.

관련 문제