2017-11-28 3 views
0

템플릿 템플릿이 아래 표시된 것과 유사한 기능을 구현하는 방법에 대해 고민하고 있습니다.다른 템플릿 인수를 허용하는 템플릿 템플릿 컬렉션

두 개의 클래스 (Java)를 고려하십시오. 첫 번째 클래스는 두 번째 템플릿 인수의 객체가 저장 될 수 있음을 지정하여 pack 메소드에 의해 반환되는 컬렉션을 제한하고 :

abstract class ContainerPacker<T, Container extends Collection<T>> { 
    abstract Container pack(T t); 
} 

그리고이 클래스의 구현의 말을하자를 Integer 유형은 볼 수 있었다 like :

class IntegerContainerPacker extends ContainerPacker<Integer, List<Integer>> { 
    @Override 
    List<Integer> pack(Integer t) { 
     List<Integer> list = new ArrayList<>(t); 
     list.add(t); 
     return list; 
    } 
} 

이제 저는 C++에서 템플릿 템플릿을 사용하여 비슷한 작업을하고 싶습니다.

template <typename T, template <typename U> class Container> 
class ContainerPacker { 
    public: 
    virtual Container<T> pack(T) = 0; 
}; 

나는 문제가 있지만 그것을 구현하는 데 문제가 다음 Container 템플릿 자체가 얼마나 알 수 있습니다. 아래의 코드는 컴파일되지 않습니다 :

class IntegerVectorPacker : public ContainerPacker<int, std::vector> { 
    public: 
    std::vector<int> pack(int t) { 
     std::vector<int> v = std::vector<int>(); 
     v.push_back(t); 
     return v; 
    } 
}; 

오류는 다음과 같습니다

error: type/value mismatch at argument 2 in template parameter list for ‘template class Container> class ContainerPacker’ class IntegerVectorPacker : public ContainerPacker {

note: expected a template of type ‘template class Container’, got ‘template class std::vector’

내가 대답을 찾고 있었어요하지만 그것도 어려운 일이 무엇인지 질문을 알아 내기 위해 묻다. 템플릿 템플릿은 어렵습니다. 코드에서

template <typename T, template <typename...> class Container> 

문제 (? 문제)와

+1

두 번째 오류는 'std :: vector '인 전체 전문화를 제공하는 대신 두 번째 템플릿 매개 변수로'std :: vector'를 제공한다는 것과 관련이있는 것으로 보입니다. 그것은 템플릿 클래스를 기대했지만 클래스 이름을 제공했다는 것입니다. – Howard

답변

1

봅니다 std::vector 하나 개 이상의 템플릿 인수받을 템플릿 클래스라는 것이다 (두 : 두 번째는 기본 유형이있다); 일치하지 않습니다 Container.

0 개 이상의 템플릿을받는 것으로 Container을 정의하면 std::vector<int> (실제로는 std::vector<int, std::allocator<int>>) 및 기타 컨테이너와 일치하도록 허용해야합니다.

- 편집 -

난 당신이 술래이 문제의 C++이 아닌 C++ 11 이상이 있는지 지금 참조하십시오.

typename... 제안은 가변적 인 템플릿을 사용할 수 없기 때문에 C++ 11부터 시작하는 경우에만 유효합니다. C++ 98

당신은

template <typename T, template <typename, typename> class Container> 

을 쓸 수 있지만 이것은 단지 두 개의 매개 변수 컨테이너와 함께 작동합니다.

- 주제 제안 오프

- 편집 2.당신이 C++ 11 이상을 사용할 수있는 경우

는 (그래서 가변 인자 템플릿) ContainerPacker에 대한 ContainerT의 순서를 전환 T는 가변 팩입니다 변환; 예 :

template <template <typename...> class Container, typename ... Ts> 
class ContainerPacker { 
    public: 
    virtual Container<Ts...> pack(Ts...) = 0; 
}; 

훨씬 유연합니다.

+0

아, 그거 완벽 해요! 두 번째 템플릿 인수가 여러 개 있지만 두 번째 템플릿이 기본값이므로 생략 할 수 있다고 생각했습니다. 어쨌든, 그것을 작동합니다, 고마워요 : – Jezor

+1

@ 제이콥 - 오프 주제 제안을 추가했습니다 (C++ 11 이상을 사용할 수있는 경우) – max66

+0

다시 한번 감사드립니다 (: 저는 C++ 11을 사용하고 있습니다. 구현시 다른 템플릿 인수를 지정하는 방법에 대해 궁금해하신 적이 있습니다. – Jezor

관련 문제