enum hack

   看《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的方式可以巧妙地为类的实现里添加一些常量将所有权限定为此类。
 
原文地址:https://www.cnblogs.com/dreamrun/p/4106288.html