1

T=std::vector<T2> 인수 (T2은 임의 유형 임)에만 일치하는 템플릿을 만들려고합니다. 템플릿 인수에 boost::enable_if을 사용할 수 있습니다. 유형 Tstd::vector인지 여부를 어떻게 테스트합니까?일부 std :: vector에만 템플릿 사용 가능 <T2> 유형

내 템플릿에 T::iterator을 포함하여 비 컨테이너 유형이 대체 오류를 일으키고 SFINAE로 간주되지 않도록 할 수 있습니다. 이 방법을 사용하면 T::iterator을 정의하는 모든 컨테이너가 일치 할뿐만 아니라 std::vector<T2>이됩니다.

답변

3

당신은 아마 enable_if를 필요로하지 않는 간단한 부분 특수화가 충분해야한다 : 당신은 함수 템플릿을 처리하는 경우

template <typename T> 
struct Type { ... }; 

// partial specialization for std::vector 
template <typename T> 
struct Type< std::vector<T> > { ... }; 

, 당신은 단순히 과부하 제공 할 수

template <typename T> 
void foo(const T & t) { ... } 

// overload for std::vector 
template <typename T> 
void foo(const std::vector<T> & vec) { ... } 
+0

+1 많은 의미가 있습니다. 나는 그 질문을 오해 한 것 같아. 나는 T2가 고정 된 타입이라고 생각했다. – sellibitze

+0

감사합니다. std :: vector에 대한 과부하를 선호하는지 확실하지 않았습니다. – eudoxos

1

왜 템플릿을 사용하고 싶습니까? 그냥 일반 함수를 작성할 수 있습니까?

어쨌든, 그것은 가능 :

template<class T 
    ,class=typename std::enable_if<(
    std::is_same<T,std::vector<int>>::value 
)>::type 
> 
void foo(T const& vec) 

(이 C++ 11 : 함수 템플릿에 대한 기본 템플릿 인수 + type_traits는 + >>되지 않는 시프트 연산자)

편집이 : 난 그냥 실현 귀하의 질문에 T2 아마도 일부 고정 된 형식이 아니라 많은 종류의 벡터 수 있도록 자리 표시 자입니다. 이 경우 Luc의 답변을 수락하는 것이 좋습니다.

Viele Grüße nach Österreich! :-)

이 방법에 대해
+0

을 - - danke, lg - – eudoxos

1

: enable_if과 함께

template <class T> 
struct is_std_vector { static const bool value=false; }; 

template <class T> 
struct is_std_vector<std::vector<T> > { static const bool value=true;} 

사용!

관련 문제