首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 阅读 Modern C++ Design 过程中的思考
【标  题】:阅读 Modern C++ Design 过程中的思考
【关键字】:Modern,C++,Design
【来  源】:http://blog.csdn.net/cutegang/archive/2006/10/19/1341389.aspx

阅读 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.呵呵~~~
什么是交叉编译(转):【上一篇】
正负整数转换成字符串并求串的长度:【下一篇】
【相关文章】
  • 较高人工智能的人机博弈程序实现(多个算法结合)含C++源码
  • C++的一点注意
  • C/C++ young 程序库设计与实现 — 序篇
  • 孙鑫VC++讲座-笔记补充(六)
  • vc++中找不到controls了
  • 将gcc下的程序移植到MSVC下 之一 - gcc对标准C/C++语言的扩展
  • C++动态内存创建与内存管理学习笔记[1]
  • C++动态内存创建与内存管理学习笔记[2]
  • C++动态内存创建与内存管理学习笔记[3]
  • C++动态内存创建与内存管理学习笔记[4]
  • 【随机文章】
  • 上海电信|北京双线|美国主机|绍兴电信|服务器托管租用13472676173秦生
  • 几个删除重复记录的SQL语句
  • Inside the C++ Object Model学习笔记[Chap3.5-3.6]
  • solaris 9下限制某些IP TELNET到本机
  • 行政区划程序的设计(七)
  • svn配置
  • 病毒的命名方法续
  • 够厉害!这玩意儿比传统的杀毒软件还厉害~!!
  • IIS网站的护心甲——实战SSL
  • 用 netfilter/iptables 为 Linux 内核 2.4.x配置防火墙
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.