申晓龙的专栏

C++,泛型编程交流,避免类似的代码和Hard-code;算法研究

排序:
默认
按更新时间
按访问量

15). 回调模板函数/回调模板成员函数,回调参数个数和类型不固定,消除类似代码

完整的源代码及用法测试代码可以在我的资源中去下载. C++语法不支持模板函数/模板成员函数作为回调函数,同时把运行期代码向编译期代码转换也只有switch...case或者if..else能够实现。 如果case比较多的时候,代码非常臃肿,而且类似的大片代码中,往往只有一个参数的不同,其它都...

2014-11-30 11:28:58

阅读数:836

评论数:0

8) 多级结构数据成员指针memberPtr [原创,泛型编程,自由下载转载,需注明出处]

在一些需求中,对结构体/类比较,计算,求和,测试的用例中,其往往是对结构/类中的某一个数据成员/数据成员的某个子成员/数据成员的...某个子成员进行比较,计算,求和,测试,这就对某类算法产生了一个需求:给定一个结构体,产生这个结构体的指定需求子成员(包括多级子成员)。比如:     struct ...

2014-02-12 13:40:05

阅读数:660

评论数:0

4) 将多元函数转换为一元函数unaryFunctionConverter [原创,泛型编程,自由下载转载,需注明出处]

在既有代码中编程时,如果想对一个数据集(容器/数组)中的所有元素进行处理时,其处理函数一般只能接受一个参数--数据集的数据类型,而既有的接口可能需要多个参数--数据集的数据类型只是这多个需求参数中的一个参数。在通常情况下,如果想使用标准算法中的forEach算法,则需要就此功能另外再写一个函数/函...

2014-02-12 10:55:11

阅读数:1022

评论数:0

2) 转换类型typeConvert [原创,泛型编程,自由下载转载,需注明出处]

这些基于typeTraits提供的一些类型转换功能,比如典型的if-else等等,判断两个类型是否相同,是否原始类型相同,,是否可转换,是否值可转换,是否基类派生类,是否序列类,是否数组,是否是原子类型,是否是内置类型,是否是枚举类型。 如果你的项目中允许使用boost这类重量级库的话,还是推荐你...

2013-10-07 14:26:55

阅读数:858

评论数:0

10) 泛型工厂方法创建实例ClassRegister [原创,泛型编程,自由下载转载,需注明出处]

这个源文件的功能是实现像MFC的动态创建的效果。、 但是和MFC相比,这个功能有下列优势: 1.MFC的动态创建创建出来的类的基类必须是CObject的,这个源文件没有任意限制,因为这个源文件的实现是模板化的,这创建出来的对象的基类可以是任意类型的--取决于你给它的约定。 2.MFC的动态创建创建...

2013-10-07 12:41:17

阅读数:1085

评论数:0

6) 创建一元函数/二元函数functionCreater [原创,泛型编程,自由下载转载,需注明出处]

这个文件是和将多元函数转换为一元函数unaryFunctionConverter配合使用的,unaryFunctionConverter提供了转换的实现,但是使用起来不便,此文件functionCreater将这些转换封装成了makeUnaryFunction/makeBinaryFunction...

2014-02-12 11:32:56

阅读数:681

评论数:0

5) 函数特征functionTraits [原创,泛型编程,自由下载转载,需注明出处]

前面已经有了类型特征,用于判断一个类型的各种属性。 函数也是程序设计中的一个重要概念,因此判断一个函数的各种属性也很重要。 这些属性包括一个函数的: 返回值,参数个数,每个参数的类型 如果是成员函数,还应该包括对象的类型。 这个文件支持了查询函数属性的功能,但是最多只支持5个参数的函数(成员函数的...

2014-02-12 11:21:44

阅读数:640

评论数:0

7) 占位符类型placeHolder [原创,泛型编程,自由下载转载,需注明出处]

要泛型设计中,某些类型或者值在编译阶段是无法确实的,但是又确实需要把这个位子给占住,在实际运行中,再用确切的类型/值来替换。 就好比一个人雇人排队买房:排队的是占位符,但是真正买房时,还是你自己去的。 下面实现了占位符功能,且最多支持5个占位符。 #ifndef placeHolder_h__...

2014-02-12 11:09:10

阅读数:549

评论数:0

3) 一元/二元函数抽象function [原创,泛型编程,自由下载转载,需注明出处]

function/function object是运行时调用的基础,在模板中,最常用的函数是一元函数及二元函数。 通常一元函数R (*)(TP)是遍历的组件,如果R是bool类型或者进行二次封装(把R由非bool转换为bool),则一元函数R (*)(P)还可以成为测试组件,用于if的条件。 通常...

2014-02-12 10:36:48

阅读数:786

评论数:0

这是vs2008编译器的一个bug么?

在vs2008中测试如下代码: struct tagS{}; bool  VSBug(tagS const& l, const tagS r) {     return true; } template void showType(T f) {    ...

2014-01-16 20:36:50

阅读数:602

评论数:0

把一个非延缓评估的元函数转换为一个延缓评估的元函数(Lazy evaluation)

在C++的模板元编程中,如果使用了T::type , T::value , T::apply之类的语法,其将导致编译器立马对该类型表达式进行求值,有些时候,这些求值工作是不必要的,将增加编译器的编译时间,我们可以将之延迟到最后一刻确实需要进行类型计算的时候再去求值,此称之为Lazy evaluat...

2013-12-04 15:22:58

阅读数:650

评论数:0

产生及判断NaN及INFINITE数值

本人工作中经常需要用到NaN及Inf浮点数,原来使用是IBM公司封装的CDecfloat数据类型,后来发现这个数据类型的许多缺点: 1. 数据类型size太大,浪费内存:这个数据类型用来表示浮点数,在x86 32位机器上竟然需要100多个字节。 (浮点数只需要4字节啊,IBM的大神们) 2. ...

2013-12-02 13:00:50

阅读数:8193

评论数:0

胡思乱想:C程序员,C++程序员,java程序员都在追求什么

如果走技术路线的话,那么C程序员,C++程序员,java程序员都在实践中追求什么呢??在保证正确性的大前提下,胡思乱想了一点儿,感觉如下: 1。C程序员 : 玩算法,追求高效率,宜用于底层。 2。C++程序员 : 兼顾效率,追求通用性及灵活性,宜用于做构架框架。 3。java程序员:追求语法简单,...

2013-11-13 19:50:55

阅读数:851

评论数:0

避免创建不必要的大对象(把大对象转换为小对象)

在模板函数中,很多情况下,我们仅仅需要一个对象的类型,而并不需要这个对象的实体,例如:  templatetypenameT> void HandObject() {                 cout typeid(T).name() << endl; } ...

2013-10-24 16:58:51

阅读数:669

评论数:0

开始学习java

公司项目转Android/java方向,现在开始学习java,哎,十几年的C/C++经验怕要浪费了。 开始看java简明教程,感觉java把C++阉割得一塌糊涂,强大的特性全部删除掉了。 个人感觉,java的做法就是把C++的一些高级特性给封装了,然后把开发者可以自由发挥的高级语法给阉割掉了,这样...

2013-10-24 16:51:37

阅读数:567

评论数:0

反转单向链表的实现

单向链接的反转往往会拿来考验人的基本逻辑,因为其中几个变量的初始化和更新稍微考虑疏漏一点儿就出错。 下面的算法提供了一个简洁的实现,不用再考虑那几个变量的初始化及更新了。 //反转单向链表的实现。 template T* reverseSingleList(T* pHead, T* T::...

2013-10-14 09:36:14

阅读数:772

评论数:0

左移/右移指定位数字符串 (算法http://blog.csdn.net/v_JULY_v/article/details/6322882 的实现)

以下内容来自于http://blog.csdn.net/v_JULY_v/article/details/6322882 v_JULY_v博主提供了非常精妙的算法原理,佩服。但是我个人觉得算法的实现稍显麻烦,看那些算法的实现看得很头疼。 我依据博主的算法,写出了下面的实现。 实现原理:同博主所言...

2013-10-11 09:45:39

阅读数:1445

评论数:0

编译期assert函数

编译期assert函数的目的在于当条件不满足时,阻止编译,从而防止错误的逻辑通过编辑。 而运行期assert的目的在于运行时发现条件不满足时,产生一个Debug事件(DebugBreak),从而让调试器停下来方便用户检查原因。  需求描述 有些比较关系,我们期望在编译期就能确保正...

2013-10-10 10:57:47

阅读数:1257

评论数:0

结构体对齐规则

结构体对齐 , #pragma pack(4),结构体的长度(sizeof) (一个没有考虑周详的位段结构体中,可能存在大量“缝隙”) 1.       对齐规则 1.        实际对齐值决定系统一次划分内存的字节数量。系统为变量分配内存时,必须先划分够变量数据类型需要的对齐空间(对齐...

2013-10-10 10:51:19

阅读数:814

评论数:0

命名空间及匿名命名空间

把命名空间单独提出来描述是因为:命名空间的功能几乎和前缀是一致的。 1.       使用命名空间的必要性           在一个大的项目中,当多时合作时,多个人编写的库头文件中,不可以避免的存在变量名相同的冲突,特别都是作为全局变量存在的时候,这种冲突就更为明显,如何解决这种冲突?方法就是使...

2013-10-10 10:44:11

阅读数:2493

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭