我遇到这种情况:
template<unsigned int N>
class Base
{
public:
Base(){}
int myint[N];
};
template<unsigned int M>
class BaseWrapper : Base<M>
{
public:
BaseWrapper(){}
};
template<typename T>
class User
{
public:
User(){}
//int myint[T::N]; //How to statically allocate using M or N from above?
};
int main(void)
{
User<BaseWrapper<10> > myuser;
// Do something with User::myint here.
}
我希望能够使用User
的模板参数的非类型参数来静态分配User
类中的数据。我知道我可以使用模板模板参数在BaseWrapper<M>
内创建User
,但这不是我首选的方法。有什么简单的方法吗?
谢谢!
答案 0 :(得分:3)
将static const unsigned int Size = N;
添加到您的班级。
示例:
template<unsigned int N>
class Base
{
public:
Base(){}
int myint[N];
static const unsigned int Size = N;
};
然后N
类T::Size
中User
可以访问{{1}}。
答案 1 :(得分:2)
解决方案1
将const静态成员数据声明为:
template<unsigned int M>
class BaseWrapper : Base<M>
{
public:
static const unsigned int size = M; //add this line!
BaseWrapper(){}
};
然后在T::size
类中使用User
:
template<typename T>
class User
{
public:
User(){}
int myint[T::size]; //you can do this!
};
解决方案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!
};
答案 2 :(得分: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];
};
答案 3 :(得分:0)
其他人已经提到的最简单的方法是向Basewrapper
添加一个静态成员,该成员初始化为N
。
但是,如果由于某种原因你无法改变User
,那么也有办法获得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
以外的任何内容上实例化Basewrapper
,请在{{1你只需添加一行
Newbasewrapper
或者如果Newbasewrapper将某种类型作为模板参数并将N的值作为静态const成员提供,
template<unsigned int N> struct get_N<Newbasewrapper<N> > { unsigned int const value = N; };