2014-04-27 3 views
2

템플릿 클래스 Container을 사용하여 템플릿에 포함 된 항목과 저장 방법이 모두 다양하도록하고 싶습니다. 따라서 Container<int, Vector> (또는 Container<int, Vector<int> >? 어느 쪽이 맞는지 확실하지 않습니다.), Container<int, ArrayList> 등을 만들고 싶습니다. 여기에서 VectorArrayList은 템플릿 클래스입니다.C++의 템플릿 템플릿 : <T, V<T>>

올바른 방법은 무엇입니까? 나는 같은 것을 가질 수 있다고 이해 : template <class T, template <class U> class V>,하지만 두 번째 매개 변수가 첫 번째 매개 변수를 템플릿의 첫 번째 매개 변수로 사용하도록하려면 어떻게해야합니까?

편집 : 이전에 답을 얻었 으면 여기에 의견을 추가하십시오. 나는 그 질문을 제거 할 것이다. 감사.

답변

2

두 번째 매개 변수가 첫 번째 매개 변수를 템플릿의 첫 번째 매개 변수로 사용하도록하려면 어떻게해야합니까?

그런 식으로 사용하십시오. U는 선택 사항이며 실제 템플릿 매개 변수를 선언하지 않는

template <class T, template <class U> class V> 
class Container { 
    using contain_type = V<T>; 
}; 

하지만 매개 변수 :

이 올바른 구문입니다. (void f(int* p);void f(int*);과 동일하고, 첫 번째 선언에서 p입니다 많은처럼 실제 객체를 선언하지 않습니다.)

그래서 당신은 단지뿐만 아니라 작성할 수

template <class T, template <class> class V> 
class Container { 
    using contain_type = V<T>; 
}; 

곧 하지만 위의 선언에 대한 문제가 발생할 수 있습니다. std::vector, std::list, std::set 등과 같이 사용할 수 없습니다. 템플릿 매개 변수가 하나만있는 템플릿이 아니기 때문입니다. 기본 템플릿 인수 덕분에 std::vector<int>은 실제로 std::vector<int, std::allocator<int>>, std::set<int>std::set<int, std::less<int>, std::allocator<int>> 등입니다.

당신은 가변 인자 템플릿에 맞게 두 번째 매개 변수를 필요 해결하기 위해 :

template <class T, template<class...> class V> 
class Container { 
    using contain_type = V<T>; 
}; 

이 여전히 유일한 유형 매개 변수를 사용하여 템플릿을 수 있습니다,하지만 훨씬 더합니다.

이제는 Container<int, std::vector>을 유형으로 사용할 수 있습니다.

1

가장 간단한 대답은 표준 라이브러리의 모든 컨테이너에 value_type이라는 typedef 구성원이 있다는 사실에 달려 있습니다. 이것은 표준 라이브러리의 컨테이너 인스턴스화 될 때마다

template<typename T> 
struct Container 
{ 
    typedef typename T::value_type value_type; 
}; 

, 그것은이 value_type을 알 수 당신은 그냥 재미있을 수 있습니다 : 따라서, 당신은 하나의 형식 매개 변수와 클래스 템플릿을 정의 할 수 있습니다

::std::cout << sizeof(Container<::std::array<char, 1>>::value_type) << "\n"; // prints 1 
::std::cout << sizeof(Container<::std::vector<short>>::value_type) << "\n"; // prints 2 
::std::cout << sizeof(Container<::std::list<int>>::value_type) << "\n"; // prints 4 
관련 문제