阅读 Modern C++ Design 过程中的思考

(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.”.

特别注意iterationrecursive这两个字,自我尝试了下用宏来表示一系列的代码生成,得到如下结果:

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):
不同于andreiGenScatterHierarchy

 

在代码实现过程中,我发现一个问题,

/// 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就经常忘记写了),或者拼错单词了,或者少写分号了,或者两个尖括号之间忘了加个空格了(当我第一次自己写LokiTYPELIST_2宏的时候就发生过这个问题),等等等等极其繁多的小问题,而发生这些问题时,有些在你编写template的时候编译器是不给你指出来,等你编写完一个部分后,开始写具现化template的代码时,编译器毫无留情地指了出来,而且template的错误信息常常都是半点逻辑感的,非常难以阅读,修复bug需要付出大量精力!也许编译器的有些辅助设施可以帮助些小忙, 比如在micorsoft vc7.1编译器中,安装了visual assist,如拼写之类的错误有红色西下划线指出,而且有些形式的标识符(比如函数名,宏名)有特殊的颜色。

 

  
(7): template recursive的过程往往是这样:一直要到最后一刻,最后一个递归确定了某些东西(比如确定了一个type,获得了一个编译期间的常数),前面的递归的结果才能得到,看起来好象是废话,呵呵~~~~
 
(8): andrei的GenLinearHierarchy只能使用单继承,既然要继承自Unit,别无选择,只能public Unit,又因为需要进行递归操作,别无选择,Unit必须要有2个template parameter.而至于GenLinearHierarchy的template parameter的第三个参数Root,也可以不要,在最后特化GenLinearHierarchy<TYPELIST_1(T), Unit>: public Unit<T, Root>直接将Root改成EmptyType,但这样就定死了Root.呵呵~~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值