2014-04-16 4 views
1

내 C++ 템플릿 구조체에서 다른 할당자를 사용하는 다른 컨테이너 유형을 사용하고 싶습니다. 표준 : 벡터 및 thrust :: device_vector.C++ 템플릿 : 템플릿 컨테이너 용 할당 자

나는 "(2이어야한다, 1) 템플릿 인수 잘못된 번호"그렇지 않으면 내가 얻을, 명시 적으로 할당자를 지정해야합니다 : 다른 컨테이너 클래스가 다른 할당자를 사용하기 때문에

template<typename T, template <typename, typename> class Container, typename Alloc> 
struct wrap_into_container 
{ 
    typedef Container<T, Alloc> type; 
}; 

, 내가 지정해야 이 템플릿을 사용할 때마다 해당 할당 자.

할당자를 지정하지 않고도 컨테이너 유형에 따라 어떻게 얻을 수 있습니까?

은 내가 각 컨테이너 유형에 대한 전문 특성 구조체를 사용하여 생각,하지만 난 그것을 구현하는 방법을 모르거나 가능 /도 유용 경우/...

UPDATE하지 않습니다 I

C++ 11에서

답변

4

, 나는 내가 C::type 여부를 확인하지 않은

template<typename T, template <typename...> class Container> 
struct wrap_into_container 
{ 
    typedef Container<T>::type type; 
}; 

(variadics을 선호 ... 때문에 NVIDIA 컴파일러의 제한 불행하게도 C++ (11)를 사용할 수없는 것은 사실 wellformed입니다 expre

template<typename T, template <typename...> class Container> 
struct wrap_into_container 
{ 
    typedef Container<T>::type type; 
}; 

C++ 03은 기본적으로 하나의 요소 유형을 복용 단항 유형의 기능을 중첩 된 형식 정의를 사용하여 템플릿 별칭을 에뮬레이션 할 수 및 : 표준 컨테이너 유형)

주석으로

에 대한 ssion 그 타입의 컨테이너를 리턴합니다. 개념은 :

#include <vector> 
#include <deque> 
#include <set> 
#include <list> 

namespace container 
{ 
    template <typename T> struct vector { typedef std::vector<T> type; }; 
    template <typename T> struct set { typedef std::set <T> type; }; 
    template <typename T> struct list { typedef std::list <T> type; }; 
    template <typename T> struct deque { typedef std::deque <T> type; }; 
} 

template<typename T, template <typename> class Container> 
struct wrap_into_container 
{ 
    typedef typename Container<T>::type type; 
}; 

#include <string> 

int main() { 

    wrap_into_container<int,   container::set>::type ws; 
    wrap_into_container<double,  container::list>::type wl; 
    wrap_into_container<bool,  container::deque>::type wd; 
    wrap_into_container<std::string, container::vector>::type wv; 


    return ws.size() + wl.size() + wd.size() + wv.size(); 

} 

Live On Coliru

+0

나는 C++ (11)를 사용할 수 없습니다를 참조하십시오, 나는 위의 질문이 추가되었습니다. 또한 이것이 할당자를 지정하지 않아도되는 것을 어떻게 보지 못합니까? –

+0

기다리십시오. 할당자를 "외부에"전달하려면 ** 필요하다고 생각했습니다 **. 나는 편집하지. – sehe

+0

당신이 맞습니다, C :: type은 실수 였고, 다른 메타 기능과 혼동되었습니다 :) –