【问题标题】:static const members of template classes模板类的静态 const 成员
【发布时间】:2012-12-13 07:15:28
【问题描述】:

我有一个带有静态 const 成员的模板类:

template <class T>
class A
{
public:
    A(T val) : t(val) {}

    static const int VALUE = 5;

    T t;
};

假设在我的代码中某处,我使用 int、char 和 long 类型对其进行实例化。现在我想访问 VALUE:

int main()
{
    int i1 = A<int>::VALUE;
    int i2 = A<char>::VALUE;
    int i3 = A<long>::VALUE;

    return 0;
}

上述所有访问同一事物的方法不都是相同的吗?在这种情况下,其他人只是选择随机类型吗?有什么办法可以避免指定类型?

【问题讨论】:

  • 不,不同的实例化产生不同的类。我有点明白你的意思,但模板类需要一个类型,即使是static const
  • 我相信这是因为您可以使用static const T value 而不是指定int 类型。
  • @chris:嗯,我要远离这个了,有些困惑我只是没有意识到。
  • @GManNickG,我非常了解这种感觉。

标签: c++ templates


【解决方案1】:

这些都是数字常量,共享相同的值,但属于不同的名称空间。所以你不能避免指定封闭类(通过实例化模板),即使它并不是真正需要的。

但是,您可以将 static const 定义移动到 A&lt;T&gt; 将继承自的类中:

class A_Consts
{
  static const int VALUE = 5;
  ...
}; 

template<typename T>
class A : public A_Consts
{
...
};

或者,将常量定义移到类之外,并将它们都包含在一个命名空间中。恕我直言,这似乎是更好的解决方案。

【讨论】:

  • 我有类似的情况,除了我的静态 const 涉及几个较大的数组,出于大小原因和逻辑原因我不想复制它们(VALUE 与整个类家族有关,而不是每个实例化分别地)。这是我的首选解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 2017-10-20
  • 1970-01-01
  • 2020-10-07
相关资源
最近更新 更多