我有一些常量,只需要在编译时使用即可简化代码,因此我不需要运行时可用的实际变量。
传统上,这样做的方式是这样,#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] 删除。
我来说两句