2017-11-13 3 views
1

libC++을 보면서 템플릿 인자가 순방향 반복자 인 경우 함수를 오버로드하는 두 가지 방법을 발견했습니다.forward iterators에 대한 오버로딩

첫 번째 방법은

template <class ForwardIter1, class ForwardIter2> 
inline 
bool 
__some_function(ForwardIter1 first1, ForwardIter1 last1, 
       ForwardIter2 first2, ForwardIter2 last2, 
       std::forward_iterator_tag, std::forward_iterator_tag) 
{ 
    // do stuff ... 

    return true; 
} 


template <class InputIter1, class InputIter2> 
inline 
bool 
__some_function(InputIter1 first1, InputIter1 last1, 
       InputIter2 first2, InputIter2 last2, 
       std::input_iterator_tag, std::input_iterator_tag) 
{ 
    // do stuff ... 

    return true; 
} 


template <class InputIter1, class InputIter2> 
inline 
bool 
some_function(InputIter1 first1, InputIter1 last1, 
       InputIter2 first2, InputIter2 last2) 
{ 
    return __some_function(first1, last1, first2, last2, 
          typename std::iterator_traits<InputIter1>::iterator_category(), 
          typename std::iterator_traits<InputIter2>::iterator_category()); 
} 

std::iterator_traits::iterator_category을 사용하지만 또한 문제 해결의 "선호하는"방법이 두 가지 중 어느 std::enable_if

template <class ForwardIter1, class ForwardIter2> 
inline 
bool 
some_function(ForwardIter1 first1, ForwardIter1 last1, 
       ForwardIter2 first2, ForwardIter2 last2, 
       typename std::enable_if< 
        __is_forward_iterator<ForwardIter1>::value && 
        __is_forward_iterator<ForwardIter2>::value 
       >::type* = 0) 
{ 
    // do stuff ... 

    return true; 
} 


template <class InputIter1, class InputIter2> 
inline 
bool 
some_function(InputIter1 first1, InputIter1 last1, 
       InputIter2 first2, InputIter2 last2, 
       typename std::enable_if< 
        __is_exactly_input_iterator<InputIter1>::value && 
        __is_exactly_input_iterator<InputIter2>::value 
       >::type* = 0) 
{ 
    // do stuff ... 

    return true; 
} 

의 사용을 본 적이하거나 의존하는 않습니다 상황에. 이 경우 한 솔루션이 다른 솔루션보다 언제 더 좋을까요?

답변

1

더 좋은 방법은 함수 (채무 불이행 값) 여분의 매개 변수를 전달할 필요가 없습니다 있도록 반환 형식으로 enable if을 사용하는 것입니다 :

template <class ForwardIter1, class ForwardIter2> 
typename std::enable_if 
< 
    __is_forward_iterator<ForwardIter1>::value 
    && 
    __is_forward_iterator<ForwardIter2>::value 
, bool 
>::type 
some_function 
(
    ForwardIter1 first1, ForwardIter1 last1 
, ForwardIter2 first2, ForwardIter2 last2 
) 
{ 
    // do stuff ... 
    return(true); 
} 

은 또한 예약 된 이중 밑줄 식별자하지만, __is_forward_iterator 템플릿이 유효하고 어딘가에 있다고 가정 해 봅시다.

+0

아, 내 사례보다 훨씬 좋아 보입니다. 그리고 네, 이중 밑줄 함수의 이유는 libC++에서 찾은 코드의 예제를 복사했기 때문입니다. 그러나 경고를 주셔서 감사합니다. – MaLarsson