나는이 상황이있다. 나는 User
안에 BaseWrapper<M>
을 생성하기 위해 템플릿 템플릿 매개 변수를 사용할 수 있다는 것을 압니다. 그러나 이것은 제가 선호하는 방법이 아닙니다. 이 작업을 수행하는 간단한 방법은 무엇입니까?액세스 중첩 템플릿 매개 변수는
감사합니다.
나는이 상황이있다. 나는 User
안에 BaseWrapper<M>
을 생성하기 위해 템플릿 템플릿 매개 변수를 사용할 수 있다는 것을 압니다. 그러나 이것은 제가 선호하는 방법이 아닙니다. 이 작업을 수행하는 간단한 방법은 무엇입니까?액세스 중첩 템플릿 매개 변수는
감사합니다.
클래스에 static const unsigned int Size = N;
을 추가하십시오.
예 :
template<unsigned int N>
class Base
{
public:
Base(){}
int myint[N];
static const unsigned int Size = N;
};
그런 다음
N
은
User
클래스
T::Size
로 액세스 할 수 있습니다.
용액 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!
};
당신은 클래스의 정적 멤버 변수로 템플릿 매개 변수를 노출 할 수 있습니다 :
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];
};
다른 방법으로 이미 언급 한 가장 간단한 방법은 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; };