在没有模板模板参数的情况下访问嵌套模板参数

时间:2011-11-10 16:51:08

标签: c++ templates nested

我遇到这种情况:

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,但这不是我首选的方法。有什么简单的方法吗?

谢谢!

4 个答案:

答案 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;
};

然后NT::SizeUser可以访问{{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; };