如何在C ++类中定义编译时(静态)常量?

恶毒的

我有一些常量,只需要在编译时使用即可简化代码,因此我不需要运行时可用的实际变量。

传统上,这样做的方式是这样,#define NAME 123但是我想要一个类型安全的替代方法。

在类之外,您可以const int name = 123;正常工作,但似乎无法将其放在类中。例如:

class Example {
    public:
        const double usPerSec = 1000000.0;
};
double usOneMinute = 60 * Tempo::usPerSec;

适用于Visual C ++,但不适用于GCC:

error: non-static const member ‘const double Example::usPerSec’,
  can’t use default assignment operator

您可以通过使其变为静态来修复它,但是Visual C ++会抱怨:

error C2864: 'Example::usPerSec' : a static data member with an in-class
  initializer must have non-volatile const integral type
    type is 'const double'

我猜这意味着VC ++只接受static const int

我想避免在构造函数中设置值,因为那样的话我需要在运行时类的实例才能访问该值,而实际上我希望所有这些都在编译时像with一样进行处理#define

那么,如何double在类内部定义一个常量,而不用使其成为全局#define变量或使用,而无需类的实例就可以工作,并且可以在主要的C ++ 03编译器中运行呢?

沃尔特

整数类型和其他类型之间存在区别。对于整数类型,您始终可以将它们定义为const static成员,如下所示:

struct Example
{
    const static int name = 123;  // added 'static' to code in text of question
    const static unsigned usPerSec = 1000000;
};

对于非整数类型(例如double您的示例),情况更加复杂。自2011年以来(std=c++11大多数编译器都使用编译器选项),您可以简单地执行以下操作:

struct Example
{
    constexpr static double usPerSec = 1000000.0;
};

但是用gcc,这

struct Example
{
    const static double usPerSec = 1000000.0;
};

应该也可以在C ++ 03(这是GNU扩展)中工作。

但是,C ++ 03中的标准方法也是成员函数std::numeric_limits<>标准库本身也使用了这种方法(例如在中static

struct Example
{
    static double usPerSec() { return 1000000.0; }
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章