4

我想访问类之外的模板参数。我通常这样做如下:

template <class T>
class A
{
  typedef typename T T;
}

A<int>::T;

我希望能够对非类型模板参数做同样的事情。这不起作用:

template <int T>
class A
{
  typedef typename T T;
}

A<3>::T;

我会澄清为什么我需要这个。我想定义第二个类如下:

template <class C>
class B
{
  static int func() {return C::T;}
}

B<A<3> >::func();

这样做的正确方法是什么?非常感谢你。

4

3 回答 3

5

那是因为T不是类型名称,您不能typedef使用它。它是一个int值,如果你想作为类的静态成员访问它,你需要一个静态成员int。似乎您真正想要的是:

template <int T>
class A
{
  public:
    static const int x = T;
};

doSomething(A<5>::x);
于 2013-02-10T15:34:01.113 回答
2

这是一个值,而不是一个类型,所以也许:

template <int T>
class A
{
  static const int param = T;
};

然后您可以将其作为A<42>::param. 并不是说它有多大帮助,除非 A 本身在其他地方用作模板参数。

于 2013-02-10T15:37:27.877 回答
1

在第二种情况下,T不是类型,而是int值。因此,您应该将其定义为一个const int static const int值。

template <int T>
class A {
    static const int T = T;
};

请注意,习惯上使用T类型(特别是当模板是一元的时,因为类型没有歧义),以及常量的其他名称,通常是更有意义的名称,例如SIZE或最好使用Size(所有大写符号最好用于宏)。

template <int Param>
class A {
    static const int param = Param;
};

有关在模板定义的上下文中使用值的信息,请参阅其他 SO 问题(例如这个问题)。static const

于 2013-02-10T15:38:52.513 回答