那谁的技术博客

感兴趣领域:高性能服务器编程,存储,算法,Linux内核
随笔 - 210, 文章 - 0, 评论 - 1183, 引用 - 0
数据加载中……

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的特化类没有定义,此时编译器会报错。

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

未完待续....

posted on 2007-02-04 15:53 那谁 阅读(1571) 评论(1)  编辑 收藏 引用 所属分类: C\C++

评论

# re: Modern C++ Design(MCD)学习笔记 && 测试代码(一)  回复  更多评论   

加油,我以看完了。不好搞明白的东西。多写代码,即使是把它的代码一个一个
的重复的写一边和编译一边也是非常有意的。

推荐看看 c++ template 中文版(要是能看懂英文当然更是号)。这本书对模板技术的表达的还是非常全面的。

boost中的MPL库是用来完成编译器编程的,非常的不错,有空可以研究一下那个里面的代码。boost的基础就是模板。

stl并不是单纯的用了模板技术,而是用那个技术实现了范型,个人觉得用模板技术和范型思想,完全是对传统的面向对象技术的颠覆。非常的时尚
2007-02-04 23:44 | walkspeed

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理