摘要: 特别是c++项目,一半以上的时间在编译,如果遇到某些奇葩问题你还不得不rebuild而且为了优化编译速度,还得不断地修改头文件,优化包含关系,很无聊的工作如果公司有一个脚本系统就好了,大大提高生产力 阅读全文
posted @ 2013-04-09 10:54 mightofcode 阅读(312) 评论(0) 推荐(0) 编辑
摘要: 什么是SFINAE?Substitution failure is not an error,匹配失败并不是错误,意思是用函数模板匹配规则来判断类型的某个属性是否存在,也就是说SFINAE可以作为一种编译期的不完整内省方法具体参见http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error案例:使用SFINAE判断模板参数是否是class(在很多场合这个trick非常有用):template<typename T>class isClassA{ typedef char _One; typedef struct{ 阅读全文
posted @ 2013-04-07 19:04 mightofcode 阅读(3777) 评论(0) 推荐(1) 编辑
摘要: 什么是CRTP?Thecuriously recurring template pattern(CRTP) is aC++idiom in which a classXderives from a class template instantiation usingXitself as template argument.类X继承了一个以X作为模板参数的的模板,这就是CRTP,具体介绍请参看维基百科CRTP简介CRTP的意义是父类(接下来我们称之为CRTP父类,相应的子类成为CRTP子类)知道子类的类型,可以做一些虚函数做不到的事,比如维基百科里面提到的类计数,clone函数这两个东西用虚函数 阅读全文
posted @ 2013-04-03 11:51 mightofcode 阅读(3149) 评论(1) 推荐(1) 编辑
摘要: 这几天用bind的时候想到一个问题,成员函数指针有多态的效果吗?我一直以为没有,测试之后发现是可以的,我对成员函数指针的理解有误虚成员函数指针的调用过程是先调用函数vcall,vcall根据this寻址虚函数表然后去调用实际的函数,对于虚表上的每个索引x的函数都是使用vcall{x}进行调用所以同一虚函数的父类和基类的成员函数指针的值是一样的,他们都指向vall{x}所以成员函数指针是能够实现多态的我在http://www.cnblogs.com/mightofcode/archive/2013/03/03/2939439.html里面关于成员函数指针的部分写的有点问题注意:这里说的是成员函数 阅读全文
posted @ 2013-03-31 15:52 mightofcode 阅读(306) 评论(0) 推荐(0) 编辑
摘要: c/c++的头文件是一种很落后的编译机制,大量程序员在这上面浪费了无数生命理论上,只要两个类之间不存在互相包含的关系,那么编辑就应该能通过但是头文件机制却给我们造成了无数的麻烦,因为我们还要避免头文件之间的互相包含比如现在有两个类A,B,分别在a.h b.h里面如果现在AB都要依赖对方,那么a.h,b.h互相包含肯定是不行的,这个时候只有使用前置声明,但是如果作为类成员使用了对方声明的一个struct呢?那么只好把这个共用的类提到另一个头文件c.h里面,大家再去包含c.h,这样就产生了一个新的文件但是如果有更多的类,更多的头文件呢?结果是文件越来越多,改动的代价也越来越大,不胜其烦这样当然也有 阅读全文
posted @ 2013-03-27 11:41 mightofcode 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 这是前几天跟一个同事合作的感慨宏:他写的代码用了一些很难看的宏,实际完成的却是很简单的功能,但是宏难以调试其实用模板也可以实现,而且好调试一点,当然这里最好还是写最直接的代码比较好无意义的封装:几个函数就能解决的问题,却用类封装了好几层,却由于对c++没有深刻理解,没有封装好,搞出bug来了,调试了7个小时,浪费了4个人总共4x7小时keep it simple,stupid,这是诸多unix哲学里面最好用的一条了,保持简单傻瓜,多快好省地写代码! 阅读全文
posted @ 2013-03-27 11:15 mightofcode 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 委托的核心就是封装类成员函数,使不同类的不同函数能够以一种统一的方式被调用这样进行回调的方式要比使用接口通知模型少写很多代码,避免了重复工作如果不使用c++11的新特性当然也能自己抡一个类似的轮子(而且还可以随意拓展)不过有现成没有理由不用function:函数对象,可以认为这个对应于c#中的委托,不过c++11没有提供事件的抽象,下面就要实现它bind:创建函数对象的工具下面的一个类实现了类似c#事件(在c++里面还是叫委托好了)的模板struct __ut_delegate_id{ template<typename T> friend class ut_delegate;pr 阅读全文
posted @ 2013-03-13 19:47 mightofcode 阅读(686) 评论(0) 推荐(0) 编辑
摘要: 这几天被c++成员函数指针的问题搞得晕头转向下面来慢慢整理下c++对象内存布局与c++成员函数指针的知识c++对象内存布局1 成员函数如何实现的?跟普通函数了有什么区别? 成员函数需要传递this指针,以普通的成员函数为例:obj* oo1=new obj; oo1->foo();00FF9916 mov ecx,dword ptr [ebp-80h] //传递对象地址到ecx00FF9919 call obj::foo (0FF6108h) //调用函数foo()00FF9AFF pop ecx //00FF9B00 mov dw... 阅读全文
posted @ 2013-03-03 01:44 mightofcode 阅读(1042) 评论(0) 推荐(0) 编辑
摘要: emacs是一个"强大"的编辑器,是很多大牛的首选编辑器,有非常强的的自定义功能好吧,老实说我很不喜欢emacs,各种操作用快捷键按来按去太蛋疼了,特别是在你记不住快捷键的情况下我最喜欢的是编辑器有两个:记事本和vs但是最近在用学lisp,用到了lisp-in-box,不得不用emacs记一些快捷键在这里CcCc 求值并编译CxCf 打开文件CcCz 打开REPLCxCs 保存缓冲区CcCs 代码补全Cxb 切换缓冲区CcCq 补全闭括号 阅读全文
posted @ 2013-02-19 00:55 mightofcode 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 在以前的一片博文里http://www.cnblogs.com/mightofcode/archive/2012/11/19/2771216.html,我发表了我对设计模式的一点看法但是今天的一个案例又让我对设计模式又有了一点思考今天在处理这么一个问题:组件A是我以前写的,这个组件会不断被重用,而今天要写到的模块B用到了A,现在B有一个很奇葩的需求,A似乎满足不了了!,怎么办?!首先我想到的是能不能把问题简单化,绕过这个问题经过仔细的分析后,我的结论是:没法绕过去,只能硬上了,给A添加功能!在思考这个这个功能怎么在A中实现的时候,我发现这里面的逻辑很复杂,而且很特殊,后来看A代码的人一定看不懂 阅读全文
posted @ 2013-01-23 19:34 mightofcode 阅读(182) 评论(0) 推荐(0) 编辑