2017-12-02 1 views
0

:다음 의사 코드 고려 컨테이너가 반복자 유형이있는 경우 감지 여부

template<class Container> 
int some_function(const Container& container) 
{ 
     if (container has iterator) { // 
      // get an element by its iterator 
     } else { 
      // do another action 
     } 
} 

그래서, 우리는 컨테이너 유형 (. 예컨대, 벡터,리스트 된 valarray 또는 뭔가 다른)를받는 함수 템플릿을 가지고 있습니다. 주어진 컨테이너가 반복자 유형을 가지고 있는지 판별하는 것이 가능합니까 (런타임)? 컴파일 시간? 그것이 반복자를 가지고 다음`STL` 컨테이너의 경우

+1

를 사용합니다. 그러나 iterator를 컨테이너가 아닌 매개 변수로 사용하는 것이 일반적으로 더 융통성 있고 재사용 가능합니다. – Galik

+0

컨테이너에 반복기 유형이있는 경우와 지원하지 않는 경우를 모두 지원해야합니까? 귀하의 코드는 귀하가하는 것을 의미하지만, 귀하가 요청한 질문은 아닙니다. – tweej

+0

예, 두 가지 경우 모두 지원하고 싶습니다. 내 질문은 : 컨테이너에 반복기 유형이 있는지 여부를 결정하고 코드 스 니펫에 조건으로 표현했습니다. 나는 그것이 내가 묻는 질문이라고 생각한다. –

답변

2

당신은 detection idiom

#include<experimental/type_traits> 

template<typename T> 
using iterator_t = typename T::iterator; 

template<typename T> 
constexpr bool has_iterator = std::experimental::is_detected_v<iterator_t, T>; 

template<class Container> 
int some_function(const Container& container) 
{ 
     if constexpr (has_iterator<Container>) { 
      // get an element by its iterator 
     } else { 
      // do another action 
     } 
}