我已经用C++编程了几年,我已经使用了很多STL并且已经创建了我自己的模板类几次以了解它是如何完成的.
现在我正在尝试将模板更深入地集成到我的OO设计中,一个唠叨的想法不断回到我身边:它们只是一个宏,真的......你可以使用#defines实现(而不是UGLY)auto_ptrs,如果你真的想要.
这种思考模板的方式有助于我理解我的代码将如何实际工作,但我觉得我必须以某种方式忽略这一点.宏是邪恶的化身,但"模板元编程"风靡一时.
那么,真正的区别是什么?模板如何避免#define引导你进入的危险,比如
我有一个全局数组,它由枚举的值索引,其中有一个元素表示值的数量.必须通过特殊值初始化数组,遗憾的是,该值不是0.
enum {
A, B, C, COUNT
};
extern const int arr[COUNT];
Run Code Online (Sandbox Code Playgroud)
在.cpp文件中:
const int arr[COUNT] = { -1, -1, -1 };
Run Code Online (Sandbox Code Playgroud)
偶尔会更改枚举:添加新值,删除一些值.我刚刚修复的代码中的错误是初始化值不足,导致数组的其余部分用零初始化.我想对这种错误采取保护措施.
问题是要么保证arr始终使用特殊值(-1在示例中)完全初始化,要么打破编译以引起开发人员注意,因此可以手动更新数组.
最近的C++标准不可用(旧的ms编译器和一些专有的垃圾).可以在一定程度上使用模板.强烈禁止STL和Boost(不要问),但我不介意复制或重新实现所需的部分.
如果事实证明是不可能的,我将不得不考虑将特殊值更改为0,但我想避免这种情况:特殊值(the -1)可能有点过于特殊,并且在其余代码中隐式编码.
我想避免DSL和代码生成:主要构建系统在ms窗口上堵塞,并且它是主要的PITA来获取在那里生成的任何东西.