2011-11-10 3 views
2

나는이 상황이있다. 나는 User 안에 BaseWrapper<M>을 생성하기 위해 템플릿 템플릿 매개 변수를 사용할 수 있다는 것을 압니다. 그러나 이것은 제가 선호하는 방법이 아닙니다. 이 작업을 수행하는 간단한 방법은 무엇입니까?액세스 중첩 템플릿 매개 변수는

감사합니다.

답변

3

클래스에 static const unsigned int Size = N;을 추가하십시오.

예 :

template<unsigned int N> 
class Base 
{ 
public: 
    Base(){} 
    int myint[N]; 
    static const unsigned int Size = N; 
}; 

그런 다음 NUser 클래스 T::Size로 액세스 할 수 있습니다.

2

용액 1

CONST 정적 멤버 데이터로서 선언 그래서

template<typename T> 
class User 
{ 
public: 
    User(){} 
    int myint[T::size]; //you can do this! 
}; 

:

template<unsigned int M> 
class BaseWrapper : Base<M> 
{ 
public: 
    static const unsigned int size = M; //add this line! 
    BaseWrapper(){} 
}; 

이어서 User 클래스 T::size로 사용 기술인 것 2

또는 당신은 구성원으로로, 당신은이 방법을 사용할 수 있습니다 (어떤 이유) size를 추가 할 수없는 경우 :

template<typename T> struct get; 

template<unsigned int N> 
struct get< BaseWrapper<N> > //partial specialization! 
{ 
    static const unsigned int size = N; 
}; 


template<typename T> 
class User 
{ 
public: 
    User(){} 
    int myint[get<T>::size]; //get the size! 
}; 
0

당신은 클래스의 정적 멤버 변수로 템플릿 매개 변수를 노출 할 수 있습니다 :

template<unsigned int M> 
class BaseWrapper : Base<M> 
{ 
public: 
    static const int counter = M; 
    BaseWrapper(){} 
}; 

그런 다음 당신은 당신의 User 클래스에서이 정적 멤버를 사용할 수 있습니다

template<typename T> 
class User 
{ 
public: 
    User(){} 
    int myint[T::counter]; 
}; 
0

다른 방법으로 이미 언급 한 가장 간단한 방법은 Basewrapper에 정적 멤버를 추가하는 것입니다.이 정적 멤버는 N으로 초기화됩니다.

template<typename T> struct get_N; 
template<unsigned int N> struct get_N<Basewrapper<N> > { unsigned int const value = N; }; 

는 이제 User 템플릿에 그냥 get_N<T>::value을 쓸 수 있습니다 : 어떤 이유로 당신이 User를 변경할 수없는 경우

그러나, 또한 N에서 얻을 수있는 방법이있다.이것의

장점 중 하나는 정의를 건드리지 않고 사후 모든 유형을 적용, 그래서 혹시 Basewrapper보다는 무엇에 User를 인스턴스화하려는 경우, 당신은 단지 줄을 추가 Newbasewrapper에 말할 수 있다는 것입니다

또는

template<unsigned int N> struct get_N<Newbasewrapper<N> > { unsigned int const value = N; }; 
Newbasewrapper 템플릿 인수로 어떤 형태를 취해 const 정적 부재로서 N의 값을 제공하는 경우,

template<typename T> struct get_N<Basewrapper<T> > { unsigned int const value = Basewrapper<T>::N; };