看《Effective C++》的过程中,涉及enum hack,尤其是在条款48(认识template元编程)中。
TMP(Template metaprogramming,模板元编程)起手程序:编译期计算阶乘。
1 #include <iostream> 2 //计算阶乘:TMP通过“递归模板具现化”实现循环 3 //template和其特化版本、递归具现化和enum hack以及键入Factorial<n-1>::value 4 //每个Factorial template具现体都是一个struct,每个struct都使用enum hack声明一个名为value的TMP变量, 5 //value用来保存当前计算所得的阶乘值。 6 7 template<unsigned n> 8 struct Factorial 9 { 10 enum {value = n * Factorial<n-1>::value}; 11 }; 12 13 template<> 14 struct Factorial<0> 15 { 16 enum {value = 1}; 17 }; 18 19 20 int _tmain(int argc, _TCHAR* argv[]) 21 { 22 std::cout<<Factorial<5>::value<<std::endl; 23 std::cout<<Factorial<10>::value; 24 25 return 0; 26 }
enum hack使用优势(Effective C++条款03):
(1)enum hack的行为某方面比较像#define而不像const,如对enum取址不合法;enum和#define一样绝不会导致非必要的内存分配;
(2)实用主义。enum hack是模板元编程的基础技术。
关于enum hack:
在类里的enum里的常量在累的成员函数里可以直接作为整数调用,在类外可以用类名::变量名以及对象.变量名的方式来调用。应该是因为在类里面不能给某变量声明的同时给出初始值的吧,而用enum的方式可以巧妙地为类的实现里添加一些常量将所有权限定为此类。