Effective C++ Item2: Enum hack
2017-12-04 16:00
369 查看
从一个例子开始吧
对于支持类内初始化的C++编译器,这段代码可以编译通过。
但是较老的C++编译器,可能不支持类内初始化,这样我们的静态常量,必须要在类外初始化。如下:
如果没有int scores[GameTurn];,这段代码就可以用不支持类内初始化的编译器通过了。
但因为 int scores[GameTurn]; 用到了GameTurn,而GameTurn的值不能确定。所以会报如下错误。
这种情况下,如果我们仍然不想用硬编码的数字指定数组的大小,就可以考虑这篇文章的主角: enum hack 了。
使用enum hack的技巧,其思想就是把GameTurn定义为一个枚举常量。上面的代码可以写为:
这样代码就可以编译通过了。
《Effective C++》中这样描述enum hack的好处:
class Game { private: static const int GameTurn = 10; int scores[GameTurn]; };
对于支持类内初始化的C++编译器,这段代码可以编译通过。
但是较老的C++编译器,可能不支持类内初始化,这样我们的静态常量,必须要在类外初始化。如下:
class Game { private: static const int GameTurn; int scores[GameTurn]; }; const int Game::GameTurn = 10;
如果没有int scores[GameTurn];,这段代码就可以用不支持类内初始化的编译器通过了。
但因为 int scores[GameTurn]; 用到了GameTurn,而GameTurn的值不能确定。所以会报如下错误。
enum_hack.cpp:5: error: array bound is not an integer constant
这种情况下,如果我们仍然不想用硬编码的数字指定数组的大小,就可以考虑这篇文章的主角: enum hack 了。
使用enum hack的技巧,其思想就是把GameTurn定义为一个枚举常量。上面的代码可以写为:
class Game { private: // static const int GameTurn; enum {GameTurn = 10}; //no named enum class. int scores[GameTurn]; }; // const int Game::GameTurn = 10;
这样代码就可以编译通过了。
《Effective C++》中这样描述enum hack的好处:
enum hack的行为更像#define而不是const,如果你不希望别人得到你的常量成员的指针或引用,你可以用enum hack替代之。(为什么不直接用#define呢?首先,因为#define是字符串替换,所以不利于程序调试。其次,#define的可视范围难以控制,比如你怎么让#define定义的常量只在一个类内可见呢?除非你用丑陋的#undef。 使用enum hack不会导致 “不必要的内存分配”。 enum hack是模板元编程的一项基本技术,大量的代码在使用它。当你看到它时,你要认识它。
相关文章推荐
- Effective C++ Item 43 学习处理模板化基类内的名称
- 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数
- More Effective C++ 读书摘要(一、基础议题 二、运算符)Item1 - 8
- More Effective C++ 读书摘要(五、技巧1)Item25 - 27
- more effective c++之Item M3:不要对数组使用多态
- 读书笔记 effective c++ Item 19 像设计类型(type)一样设计类
- 读书笔记 effective c++ Item 21 当你必须返回一个对象的时候,不要尝试返回引用
- 读书笔记 effective c++ Item 22 将数据成员声明成private
- 《More Effective C++》 Item M2:尽量使用C++风格的类型转换
- Effective Modern C++:Item 2 ->弄清auto类型推断
- <Effective Mordern C++>笔记:Item 9:prefer alias declarations to typedefs.
- Effective C++ Item 26 尽可能延后变量定义式的出现时间
- C++之Effective STL学习笔记Item7
- 读书笔记 effective c++ Item 5 了解c++默认生成并调用的函数
- Effective C++ Item 8 别让异常逃离析构函数
- <Effective C++> (Item 13-15): 以对象管理资源
- 读书笔记 effective c++ Item 52 如果你实现了placement new,你也要实现placement delete
- Effective C++ Item 2 尽量以const, enum, inline 替换 #define
- 《more effective c++》Item M5:谨慎定义类型转换函数
- Effective C++ Item 28 避免返回对象内部数据的引用或指针