(3): Andrei说:”Because C++ lacks compile-time iteration or recursive macros, the task of adding some code for each type in a typelist is difficult.”.
特别注意iteration和recursive这两个字,自我尝试了下用宏来表示一系列的代码生成,得到如下结果:
template<typename T>
struct Holder
{
T value_;
};
#define HOLDER_AUTOGEN(CustomType) /
template<> /
struct Holder<CustomType> /
{ /
CustomType value_; /
};
#define HOLDER_TYPELIST_AUTOGEN(int, double, float, char) /
HOLDER_AUTOGEN(int) /
HOLDER_AUTOGEN(double) /
HOLDER_AUTOGEN(float) /
HOLDER_AUTOGEN(char)
缺点很显然了,给定一个类型列表(int, double, float, char)不能自动iterate,需要你手工添加每一个HOLDER_AUTOGEN。另外如果类型列表的类型个数增多或者减少,上面的宏显然就不能适用了,你需要为特定个数的类型列表写专门的HOLDER_TYPELIST_AUTOGEN提供给preprocessor来匹配。总之,the task of adding some code for each type in a typelist is very difficult~~
(4): 不同于andrei的GenScatterHierarchy
在代码实现过程中,我发现一个问题,
/// just declaration
template<typename TList, template<typename> class Unit> struct GenScatterHierarchy;
/// partial specilization具有针对某些特殊类型(并不一定要具体的某个类型,只要具有某些区别于其他类型的特征的类型)进行细化的能力
template<typename T, typename U, template<typename> class Unit>
struct GenScatterHierarchy<Typelist<T, U>, Unit>
: public Unit<T>
, GenScatterHierarchy<U, Unit>
{};
/*
template<typename AtomicType, template<typename> class Unit>
struct GenScatterHierarchy: public Unit<AtomicType>
{};
*/
template<template<typename> class Unit>
struct GenScatterHierarchy<NullType, Unit>
{};
注意加了底纹的那块代码“public Unit<T>”, andrei的实现的方式却是:public GenScatterHierarchy<T, Unit>,既然GenScatterHierarchy的目的便是“make it easy to build classes by applying each type in a typelist to a basic template",那么直接public Unit<T>,而不是public GenScatterHierarchy<T, Unit>,则可以减少一层的继承,甚至template<typename AtomicType, template<typename class Unit> struct GenScatterHierarchy: public Unit<AtomicType>这个partial template都可以不需要了。从逻辑上来说,更能迅捷达到我们的目的,当然,从andrei脑袋中的recursive neurons出发,可能就缺乏recursive之美了~~~~~~~~.
可能有什么因素我没考虑到吧,既然那么多牛人看过这本书了,如果真象我说的,他们应该早就提到这个问题了!~
(5): 在编写template的代码时,经常会发生少写一个尖括号,少写一个class(比如template template parameters时,template<typename> class Unit, 这里的class就经常忘记写了),或者拼错单词了,或者少写分号了,或者两个尖括号之间忘了加个空格了(当我第一次自己写Loki的TYPELIST_2宏的时候就发生过这个问题),等等等等极其繁多的小问题,而发生这些问题时,有些在你编写template的时候编译器是不给你指出来,等你编写完一个部分后,开始写具现化template的代码时,编译器毫无留情地指了出来,而且template的错误信息常常都是半点逻辑感的,非常难以阅读,修复bug需要付出大量精力!也许编译器的有些辅助设施可以帮助些小忙, 比如在micorsoft vc7.1编译器中,安装了visual assist,如拼写之类的错误有红色西下划线指出,而且有些形式的标识符(比如函数名,宏名)有特殊的颜色。