首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > Modern C++ Design(MCD)学习笔记 && 测试代码(一)
【标  题】:Modern C++ Design(MCD)学习笔记 && 测试代码(一)
【关键字】:Modern,C++,Design,MCD
【来  源】:http://www.cppblog.com/converse/archive/2007/02/04/18325.html

Modern C++ Design(MCD)学习笔记 && 测试代码(一)

MCD里面给我们展现了许多高阶的C++ template技巧,大部分都是天才级别的人才能想出来的,与此同时,这些技巧也稍显前卫了,至少根据我对国内C++程序员的了解,能把STL玩的很好的已经少见了,并且里面的大部分技巧是在“挑战编译器”。

但是,我还是决定好好把这本书看完,一边看一边摘录书中以及loki库中的代码进行测试,权当开阔自己的视野。

一.compile assert编译器断言技巧
//?以下是书中的代码
template<bool>?struct?CompileTimeError;
template
<>?struct?CompileTimeError<true>{};

#define?STATIC_CHECK(expr)??\
????(CompileTimeError
<?(expr)?!=?0>()?)

template
<bool>?struct?CompileTimeChecker
{
????CompileTimeChecker();
}
;

template
<>?struct?CompileTimeChecker<false>?{};

#define?STATIC_CHECK_MSG(expr,?msg)?\
????
{\
????????
class?ERROR_##msg?{};\
????????(
void)sizeof(CompileTimeChecker<(expr)>?(ERROR_##msg()));\
????}


//?以下是loki中的代码
namespace?Loki
{
????template
<int>?struct?CompileTimeError;
????template
<>?struct?CompileTimeError<true>?{};
}


#define?STATIC_CHECK_LOKI(expr,?msg)?\
{?Loki::CompileTimeError<((expr)?!=?0)>?ERROR_##msg;?(void)ERROR_##msg;}?

int?main(int?argc,?char?*argv[])
{
????
//?gcc不能编译,VC7编译通过
????STATIC_CHECK(1);
????
//?gcc,VC7都不能编译
????
//STATIC_CHECK_MSG(1,?Error_Msg);
????
//?gcc,VC7都能编译
????STATIC_CHECK_LOKI(1,?Error_Msg);

????
return?0;
}




这个东东的技巧在于:定义一个模版类,这个模版的模版参数是bool类型,对true的特化模版类进行了定义,而false的特化类没有定义,在使用的时候把需要断言的表达式作为模版参数来初始化这个模版类,如果为false,因为false的特化类没有定义,此时编译器会报错。

注意:这里的断言是在编译期进行的,与一般的运行时断言有区别。

未完待续....
inger源码分析--错误报告模块:【上一篇】
从今天开始分析编译器inger的源代码:【下一篇】
【相关文章】
  • Modern C++ Design(MCD)学习笔记 && 测试代码(二)
  • MD5算法(C++实现)
  • C++词汇集锦编程人必备
  • 学习C++语言的50条建议
  • C++转型操作符
  • 将 Visual Studio C 和 C++ 项目迁移到 Eclipse CDT
  • c++里关于cerr,clog,cout三者的区别
  • 几个c++语句的汇编实现(H1指令)
  • My understanding of Object Oriented C++
  • 获得当前系统时间(C/C++)
  • 【随机文章】
  • Javascript?动态控制字体大小?By?Stabx
  • 2005.8.22 passed the 310-015(SA299) exam.
  • 更改“任务计划”的提示信息
  • WINDOWS的kill命令
  • 数组比链表快多少?
  • c#资源管理器
  • linux软中断的读书笔记
  • 水晶报表中画斜线的方法
  • 基于Nokia S60的游戏开发之三
  • JavaScript加密解密7种方法
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.