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;
}
의 사용을 본 적이하거나 의존하는 않습니다 상황에. 이 경우 한 솔루션이 다른 솔루션보다 언제 더 좋을까요?
아, 내 사례보다 훨씬 좋아 보입니다. 그리고 네, 이중 밑줄 함수의 이유는 libC++에서 찾은 코드의 예제를 복사했기 때문입니다. 그러나 경고를 주셔서 감사합니다. – MaLarsson