2011-01-18 4 views
4

STL의 벡터 템플릿 인수에 대한 템플릿을 전문화하고 싶습니다. 다음과 같은 것 :is_stl_vector 구현 방법

// (1) 
template <typename T> 
class A 
{ 
    ... 
}; 

// (2) 
template <> 
class A<std::vector<> > 
{ 
    ... 
}; 

벡터 요소의 유형이 무엇인지는 신경 쓰지 않습니다. 다음과 같이 사용하고 싶습니다.

일반적으로 나는 부스트의 형질과 비슷한 것을 정의하려고 노력해 왔습니다. 뭔가 같은

너무 템플릿이 아닌 유형에 대해 컴파일해야하기 때문에 나는 (너무) 생각 템플릿 템플리트를 사용할 수 없습니다. 전혀 가능합니까?

+3

'표준 : vector'는 C++ 표준 라이브러리가 아닌 STL에서입니다. –

+0

@Tomalak : 무엇? 'std :: vector'는 STL로부터 온 것이 아닌가? 그러면 STL은 무엇입니까? – Nawaz

+0

@Tomalak :'std :: vector'는 [STL] (http://en.wikipedia.org/wiki/Standard_Template_Library)의 일부로 C++ 표준 라이브러리에 포함되어 있습니다. 그래서 그것은 실제로 둘 다입니다. –

답변

7

당신은 단순히 같은 전문 수 있습니다

// (2) 
template <typename T, typename Alloc> 
struct A<std::vector<T, Alloc> > 
{...}; 
+2

당신은 +1을 얻을 것입니다. 단점이 전혀 없습니다. jpalecek의 대답을보십시오. –

+0

@Tomalak Geret'kal : 실제로 템플릿 매개 변수 수를 변경하면 문제가 없어야한다고 생각합니다. 그 이유는 std :: vector 이 기본 템플릿 인수를 사용해야하기 때문입니다 (템플릿에 템플릿 유형을 사용하는 것과 다른 경우, 정확한 선언이 필요한 경우). 내 컴파일러는이 작업을 템플릿 구조체 A > {...}에서도 수행하는 것으로 동의합니다. 물론 추가 템플릿 매개 변수에 기본이 아닌 인수를 사용하는 벡터와 일치하지 않지만 희귀합니다. 내가 틀렸다면 나를 바로 잡아주세요. – Grizzly

+0

@Tomalak : 사실 간단합니다. jpalecek의 대답에 대한 내 의견을 참조하십시오. –

6

전문화은 다음과 같이 진행됩니다 std::vector의 템플릿 매개 변수의 개수가 구현마다 다를 수 있기 때문에 (그리고 일 보장된다 다른 방법이 SI 없음) 작동하지 않을 수 있습니다

// (2) 
template <class T, class U> 
class A<std::vector<T, U> > 
{ 
    ... 
}; 

하는 것으로. C++ 0x에서 이것은 매개 변수 팩을 사용하여 해결할 수 있어야합니다.

+0

이것은 사용자 정의 코드가 기본 값을 가지고 있어도 표준을 따르는 std :: vector가 유형 및 할당 자 템플릿 매개 변수 이외의 다른 매개 변수를 가질 수 없다는 것을 사용자 코드가 깨뜨릴 수 있기 때문입니다.그러나 위 코드가 실패한 구현을 찾기가 매우 어려울 것이라고 생각합니다. –

+0

@Fred Nurk : 장과 절? 'float (* pSin) (float) = & std :: sin'은'float std :: sin (float)'에 여분의 디폴트 인자가있을 때 깨진다. – MSalters

+0

@MSalters : C++ 03 §1.4p2 "프로그램에이 국제 표준의 규칙 위반이없는 경우, 준수 구현은 리소스 제한 내에서 해당 프로그램을 수락하고 올바르게 실행해야합니다." §1.4p8 "적합성있는 구현물은 잘 구성된 프로그램의 동작을 변경하지 않는다면 확장 기능 (추가 라이브러리 기능 포함)을 가질 수 있습니다." 그리고 네, 이것은 정규 함수와 실제로 stdlib 전체에 적용됩니다. –