在C++允许class中使用static const
的特性之前,人们常用一种被称为"enum hack"的技巧,以在类中定义编译期常量。
具体做法就是在类中定义一个没有名字的enum object,然后在该object中定义需要的常量。原理就是,所有enum类型都必须在编译期就确定好成员的值,故可以用于常量表达式中。
示例:
class Function{
enum { dimension = 100}; // 也可以用static const dimension = 100;
double point[dimension];
}
这种定义在类中的匿名枚举类型中的常量,只能在类中被访问:
// 测试enum hack特性
#include <iostream>
using namespace std;
class Example{
enum {bufsize = 100};
int data[bufsize];
};
int main(){
// cout << bufsize << endl; // error: ‘bufsize’ was not declared in this scope
}
可以看到,在类中定义的无名enum类型只能在类中被访问。
如果给enum类型加上类型名,并且设置为public的,则可以通过::
访问到:
class Example{
public:
enum {bufsize = 100};
private:
int data[bufsize];
};
int main(){
Example::bufsize; // 可以访问
}
注意,这里声明时,要把enum放在data前面,毕竟使用bufsize前要先定义bufsize。