2012-03-30 4 views
2

추가 템플릿 매개 변수를 가져 오기 위해 템플릿 클래스를 특수화 할 수 있습니까? 예를 들어C++은 추가 템플릿 매개 변수를 가져 오기 위해 템플릿 클래스를 특수화합니다.

:

template <typename T> 
struct X { 
    void foo() { cerr << "Generic" << endl;} 
}; 


template <> 
template <bool b> 
struct X<int> { 
    void foo() { cerr << "Specialization" << endl;} 
}; 

내가 g의 ++과 위의 작품을 만들 수 없습니다,하지만 어쩌면이 일을 몇 가지 트릭이있다.

편집 :에있는 경우에만 X<int>. 의 기능이기 때문에 나는, 기본 템플릿 X에 템플릿 <bool b>를 이동하고 싶지 않아, 나는 사용자가 임의의 값을 지정할 필요가 없습니다 수 있도록 할 수있는 방법이 그것을 위해? 나는이 경로를 따라 가지 않는 접근법 인 을 정말로 원할 것이다.

template <typename T> 
struct Foo 
{ 
    typedef typename T::type type; 

    // work with "type" 

    void static print() { std::cout << T::message << std::endl; } 
} 

가 그런 특성 클래스 정의 :

+0

부분 템플릿 전문화에 대해 들었습니까? –

+2

"* 필요한 경우 사용자가 값을 지정할 필요가 없도록 할 수있는 방법이 있습니까? *"예 - 기본 템플릿 매개 변수입니다. 예 : '템플리트 '. – ildjarn

+1

@ildjarn이 말했듯이 대부분의 경우 bool 이외의 다른 유형을 사용하는 것이 좋습니다. 'mytempl '대'myempl '는 보통 mytempl 과 mytemplat의 차이보다 의미가 있습니다. –

답변

2

대신 프록시 특성 클래스를 받아들이는 기본 템플릿을 변경할 수 있습니다 지금

template <typename T> 
struct traits 
{ 
    typedef T type; 
    static const char * const message = "Generic"; 
}; 

당신이 Foo<traits<double>>Foo<traits<int>> 인스턴스화 할 수 있습니다, 당신은 캡슐화 할 수 있습니다 traits 클래스에 대한 추가 동작. 필요에 따라 전문화 할 수 있습니다.

template <> 
struct traits<int> 
{ 
    typedef int type; 
    static const char * const message = "Specialized"; 
}; 
+0

기본 템플릿을 변경할 필요가 없습니다. 'traits '을 받아들이는 전문화를하십시오. –