- 博客(34)
- 资源 (7)
- 收藏
- 关注

原创 15). 回调模板函数/回调模板成员函数,回调参数个数和类型不固定,消除类似代码
完整的源代码及用法测试代码可以在我的资源中去下载.C++语法不支持模板函数/模板成员函数作为回调函数,同时把运行期代码向编译期代码转换也只有switch...case或者if..else能够实现。如果case比较多的时候,代码非常臃肿,而且类似的大片代码中,往往只有一个参数的不同,其它都是相同的。这对于用户来说,都是一个大量的重复性的hard-code性的负担,而且也容易导致出
2014-11-30 11:28:58
1470

原创 8) 多级结构数据成员指针memberPtr [原创,泛型编程,自由下载转载,需注明出处]
在一些需求中,对结构体/类比较,计算,求和,测试的用例中,其往往是对结构/类中的某一个数据成员/数据成员的某个子成员/数据成员的...某个子成员进行比较,计算,求和,测试,这就对某类算法产生了一个需求:给定一个结构体,产生这个结构体的指定需求子成员(包括多级子成员)。比如: struct S1 { int m_s1; }; stru
2014-02-12 13:40:05
966

原创 4) 将多元函数转换为一元函数unaryFunctionConverter [原创,泛型编程,自由下载转载,需注明出处]
在既有代码中编程时,如果想对一个数据集(容器/数组)中的所有元素进行处理时,其处理函数一般只能接受一个参数--数据集的数据类型,而既有的接口可能需要多个参数--数据集的数据类型只是这多个需求参数中的一个参数。在通常情况下,如果想使用标准算法中的forEach算法,则需要就此功能另外再写一个函数/函数对象以把额外的参数封装在函数内部,或者直接自己遍历这个数据集,把既有函数中的代码Ctrl+C/Ctr
2014-02-12 10:55:11
2122

原创 2) 转换类型typeConvert [原创,泛型编程,自由下载转载,需注明出处]
这些基于typeTraits提供的一些类型转换功能,比如典型的if-else等等,判断两个类型是否相同,是否原始类型相同,,是否可转换,是否值可转换,是否基类派生类,是否序列类,是否数组,是否是原子类型,是否是内置类型,是否是枚举类型。如果你的项目中允许使用boost这类重量级库的话,还是推荐你使用boost,下面的源代码提供了一个可供选择的替代方案:如果你不想引入boost这种巨无霸或者你的
2013-10-07 14:26:55
2042

原创 10) 泛型工厂方法创建实例ClassRegister [原创,泛型编程,自由下载转载,需注明出处]
源代码可以在我的资源中去下载(包括用法测试的源代码):https://github.com/ShenXiaolong1976/MiniMPL 只需要用VS建一个空的工程,然后引入我的测试头文件即可。然后测试函数会在main函数之前运行,在控制台窗口中可以看到输出。 这个源文件的功能是实现像MFC的动态创建的效果。 但是和MFC相比,这个功能有下列优势: 1.MFC的动态创建...
2013-10-07 12:41:17
1586
原创 g++ 编译器模板解析近似缺陷的限制(C++标准议论)
g++ 编译器对复杂模板的支持非常有限,这儿记录一个g++对C++模板解析近似bug的限制。
2024-08-29 11:23:39
820
原创 利用编译期函数构建又快又小的程序
论证用C++模板元技术来优化二进制模块大小(binary size optimize)的原理与技术实践,并且提高运行时性能,构建又快又小的程序
2024-08-02 13:29:22
591
原创 6) 创建一元函数/二元函数functionCreater [原创,泛型编程,自由下载转载,需注明出处]
这个文件是和将多元函数转换为一元函数unaryFunctionConverter配合使用的,unaryFunctionConverter提供了转换的实现,但是使用起来不便,此文件functionCreater将这些转换封装成了makeUnaryFunction/makeBinaryFunction以方便使用,使用者只需要提供函数指针及必要的传入参数即可创建正确的一元/二元函数对象、#i
2014-02-12 11:32:56
1067
原创 5) 函数特征functionTraits [原创,泛型编程,自由下载转载,需注明出处]
前面已经有了类型特征,用于判断一个类型的各种属性。函数也是程序设计中的一个重要概念,因此判断一个函数的各种属性也很重要。这些属性包括一个函数的:返回值,参数个数,每个参数的类型如果是成员函数,还应该包括对象的类型。这个文件支持了查询函数属性的功能,但是最多只支持5个参数的函数(成员函数的对象类型除外)#ifndef functorTraits_h__#defin
2014-02-12 11:21:44
1090
原创 7) 占位符类型placeHolder [原创,泛型编程,自由下载转载,需注明出处]
要泛型设计中,某些类型或者值在编译阶段是无法确实的,但是又确实需要把这个位子给占住,在实际运行中,再用确切的类型/值来替换。就好比一个人雇人排队买房:排队的是占位符,但是真正买房时,还是你自己去的。下面实现了占位符功能,且最多支持5个占位符。#ifndef placeHolder_h__#define placeHolder_h__#include #if
2014-02-12 11:09:10
863
原创 3) 一元/二元函数抽象function [原创,泛型编程,自由下载转载,需注明出处]
function/function object是运行时调用的基础,在模板中,最常用的函数是一元函数及二元函数。通常一元函数R (*)(TP)是遍历的组件,如果R是bool类型或者进行二次封装(把R由非bool转换为bool),则一元函数R (*)(P)还可以成为测试组件,用于if的条件。通常二元函数是R (*)(TP1,TP2)是比较/交换的组件,用于比较两个值,其用于if的条件,或者用
2014-02-12 10:36:48
1293
原创 这是vs2008编译器的一个bug么?
在vs2008中测试如下代码:struct tagS{};bool VSBug(tagS const& l, const tagS r){ return true;}templatevoid showType(T f){ cout }void main() { showType(VSBug);
2014-01-16 20:36:50
858
原创 把一个非延缓评估的元函数转换为一个延缓评估的元函数(Lazy evaluation)
在C++的模板元编程中,如果使用了T::type , T::value , T::apply之类的语法,其将导致编译器立马对该类型表达式进行求值,有些时候,这些求值工作是不必要的,将增加编译器的编译时间,我们可以将之延迟到最后一刻确实需要进行类型计算的时候再去求值,此称之为Lazy evaluation。下面通过Lazy_If_T 为例演示了如何把一个非延缓评估的元函数转换为延迟评估的元函数-
2013-12-04 15:22:58
869
原创 产生及判断NaN及INFINITE数值
本人工作中经常需要用到NaN及Inf浮点数,原来使用是IBM公司封装的CDecfloat数据类型,后来发现这个数据类型的许多缺点:1. 数据类型size太大,浪费内存:这个数据类型用来表示浮点数,在x86 32位机器上竟然需要100多个字节。 (浮点数只需要4字节啊,IBM的大神们)2. 操作效率低下,来回和string相倒换,有时候完全没有必要。3. rescale后,原有的数值
2013-12-02 13:00:50
12315
原创 胡思乱想:C程序员,C++程序员,java程序员都在追求什么
如果走技术路线的话,那么C程序员,C++程序员,java程序员都在实践中追求什么呢??在保证正确性的大前提下,胡思乱想了一点儿,感觉如下:1。C程序员 : 玩算法,追求高效率,宜用于底层。2。C++程序员 : 兼顾效率,追求通用性及灵活性,宜用于做构架框架。3。java程序员:追求语法简单,语言本身封装了很多应用层的东西,易于上手,适宜于新手及快速开发。C语言是C++语言的
2013-11-13 19:50:55
1310
原创 避免创建不必要的大对象(把大对象转换为小对象)
在模板函数中,很多情况下,我们仅仅需要一个对象的类型,而并不需要这个对象的实体,例如: templatetypenameT>void HandObject(){ couttypeid(T).name() <<endl;} 在调用时,用户必须明确地指定模板类型:HandObjectbigObject>();很多时候,用户并不喜欢这
2013-10-24 16:58:51
1278
原创 开始学习java
公司项目转Android/java方向,现在开始学习java,哎,十几年的C/C++经验怕要浪费了。开始看java简明教程,感觉java把C++阉割得一塌糊涂,强大的特性全部删除掉了。个人感觉,java的做法就是把C++的一些高级特性给封装了,然后把开发者可以自由发挥的高级语法给阉割掉了,这样用户只能使用java封装后的东西。而且听人介绍的java中比较牛的特征后,感觉这些特性都可以用
2013-10-24 16:51:37
820
原创 反转单向链表的实现
单向链接的反转往往会拿来考验人的基本逻辑,因为其中几个变量的初始化和更新稍微考虑疏漏一点儿就出错。下面的算法提供了一个简洁的实现,不用再考虑那几个变量的初始化及更新了。//反转单向链表的实现。templateT* reverseSingleList(T* pHead, T* T::*pNext,T*& pNewHead){ if (
2013-10-14 09:36:14
1018
原创 左移/右移指定位数字符串 (算法http://blog.youkuaiyun.com/v_JULY_v/article/details/6322882 的实现)
以下内容来自于http://blog.youkuaiyun.com/v_JULY_v/article/details/6322882v_JULY_v博主提供了非常精妙的算法原理,佩服。但是我个人觉得算法的实现稍显麻烦,看那些算法的实现看得很头疼。我依据博主的算法,写出了下面的实现。实现原理:同博主所言,所谓的字符串左移/右移,就是交换字符串的两部分而已。所以下面的算法实现中,除了最终的一次
2013-10-11 09:45:39
1850
原创 编译期assert函数
编译期assert函数的目的在于当条件不满足时,阻止编译,从而防止错误的逻辑通过编辑。而运行期assert的目的在于运行时发现条件不满足时,产生一个Debug事件(DebugBreak),从而让调试器停下来方便用户检查原因。 需求描述有些比较关系,我们期望在编译期就能确保正确,需求情形:比如A,B,我们要求编译期就能保证A>B,否则编译不能通过。很明显,如果使用普通
2013-10-10 10:57:47
3094
原创 结构体对齐规则
结构体对齐 , #pragma pack(4),结构体的长度(sizeof)(一个没有考虑周详的位段结构体中,可能存在大量“缝隙”)1. 对齐规则1. 实际对齐值决定系统一次划分内存的字节数量。系统为变量分配内存时,必须先划分够变量数据类型需要的对齐空间(对齐模数,字节单位)。2. 结构体的实际对齐值为结构体中最大的数据类型的长度A与系统规定的
2013-10-10 10:51:19
1187
原创 命名空间及匿名命名空间
把命名空间单独提出来描述是因为:命名空间的功能几乎和前缀是一致的。1. 使用命名空间的必要性 在一个大的项目中,当多时合作时,多个人编写的库头文件中,不可以避免的存在变量名相同的冲突,特别都是作为全局变量存在的时候,这种冲突就更为明显,如何解决这种冲突?方法就是使用命名空间。 比如说,每个人所定义的变量,都以他自己的名字的缩写为前缀,假如...
2013-10-10 10:44:11
8037
3
原创 typeid及RTTI
C++中类型识别符typeid分静态识别和动态识别。静态识别是指在编译阶段进行的识别,动态识别是指在运行阶段进行的识别。只有动态识别需要RTTI的支持,但是RTTI是否打开不影响编译链接,只影响运行结果是否正确。 typeid的工作原理:1. typeid是依赖于保存在虚函数表里面的type_info块来获取真实对象信息的。而如果基类没有任何虚函数的话,typeid就
2013-10-10 10:27:49
1543
原创 内部链接(internal linkage)和外部链接(external linkage)
内部链接(internallinkage)/外部链接 (externallinkage)是和编译单元(translation unit)相关的一个术语,其主要影响函数或者对象的作用域及存储方式—是全局只存储一个,还是全局有许多量的副本。具有externallinkage的变量可以被其它源文件使用,整个程序内有效,并且全局只有一个。具有internallinkage的变量只能被本transl
2013-10-10 10:23:12
5461
3
原创 遍历所有时区的代码[windows]
window要没有提供遍历时区的代码,只提供了一些接口,让用户自己从注册表中遍历。比较麻烦,下面代码把这个功能封装了一下,让用户可以比较简单地处理所有时区。其中字符串用的是core::cstringex,大家可以用STD里面的字符串来代替,core::datetime里的数据结构体和SYSTEMTIME一样,大家可以把SYSTEMTIME封装一下就可以替换它了。//timezone.h
2013-10-10 10:15:47
1408
原创 简单地使用sym*函数族导出函数栈(Based on x86)
在有时我们需要导致当前线程的函数栈调用,但是我们又不期望自己来实现这个功能,下面的源代码可以帮你解决。导出函数栈其实就是sym*函数族的应用,该函数在dbghelp.dll中的,下面只是实现了简单的用法,使用的缺省的符号搜索路径,没有设置用户自定义的搜索路径:这样有两方面的考虑: 1. 这不是一个GUI程序,不想让使用者觉得麻烦,这里更合适的说法是提供了一个函数供用户调用。2.一般
2013-10-08 11:05:50
1426
1
原创 9) 泛型数学运算符函数mathOperator [原创,泛型编程,自由下载转载,需注明出处]
下面是一些算术操作符,其通常作为一些接口的比较参数传入。泛型的。#ifndef mathOperator_h__#define mathOperator_h__#include "typeConvert.h"/********************************************************************Descr
2013-10-07 14:34:20
1007
原创 1) 获取类型特征typeTraits [原创,泛型编程,自由下载转载,需注明出处]
由于在我们的项目中,不能使用std及其它的主流库(boost等),在需要判断一些类型特征及类型转换时,就只能自己写这些功能了。这面是这些功能的实现(当然boost实现得更好:如果你的项目中允许使用boost这种重量级的库时,那么还是推荐你使用boost,如果不能,那么这些源代码可供替代使用)#ifndef typeTrait_h__#define typeTrait_h__#i
2013-10-07 14:18:50
1206
原创 14) 常用的遍历/(条件)查找/收集数据/(拷贝2比较优先)排序算法algorithm [原创,泛型编程,自由下载转载,需注明出处]
下面的一套算法,配合前面提供的泛型库的支持部件,能够提供下列基于概念的功能:1.遍历处理2.统计计数3.查找4.最大/最小值5.收集 : 收集的结果可以是任何形式的:数组/容器,T/T*,并且调用接口是完全相同的(减轻用户负担),代码内部会自动进行类型识别。6.累加7.排序7.1) 用户可以指定执行方式是比较优先/拷贝优先/缺省自动 7.2) 按参照顺序排序
2013-10-07 14:13:17
1264
原创 13) 参数适配ParamterWrapper [原创,泛型编程,自由下载转载,需注明出处]
我们在写C++接口时,通常会有下列参数形式:1. T, T&以出于不同的需求,比如对于一些内置参数,由于其复制很高效,T及T&没有什么大的区别,我们就可以使用T形式;但是对于一些比较大的对象,如果用T,则传递过程中会构造临时对象出来,浪费效率;或者对于一些不可复制对象,使用T根本编译不过,就需要使用T&形式;对于一些C程序员2. 或者部分C++程序员来说,可能会使用T*形式,但是这样,就把
2013-10-07 13:52:58
999
原创 11) 为STL容器和数组提供统一的接口DataSet [原创,泛型编程,自由下载转载,需注明出处]
在一些产品上,对于数据块,有些人喜欢用数组,比较典型的C程序员,有些人喜欢用STL容器,对于框架操作,我们通常希望存取这些对象能够使用一套统一的接口去存取它,因为从概念上讲,它们无非就是一组数据的集合,我不关心存取它们方式的不同,只需要给我一个,存入一个数等。为了满足这些需求,下列源文件提供把C数组和STL容器做了统一的封装,以提供一样的接口。(没有提供查入/删除接口)#ifndef
2013-10-07 13:34:49
992
原创 9) 常用函数对象functionobject [原创,泛型编程,自由下载转载,需注明出处]
在使用STL算法时,第三个参数通常是一些函数对象。这样,我们为了使用STL提供的算法函数,就不得不提供一些零碎的,小的函数对象,有可能这些函数对象仅仅这只这一处使用,我们就不得不写这样一个函数对象类。大多数时候,这个函数对象提供的功能可能非常简单,比如说就是根据结构体里的某个子结构体的某个子成员值相比较,或者满足某种大小的需求,这类需求功能从概念上讲是一样的,但是实现起来,就不得不一一书写这些琐碎
2013-10-07 13:25:50
964
原创 12) 类型安全的任意类CAnyObject [原创,泛型编程,自由下载转载,需注明出处]
anyObject.h , 这是泛型库中13个源文件中的一个,不知道csdn有没有自动上传源代码的功能,有知道怎么用的朋友请告诉我一声。这个源文件可以封装任意类到一个共同的类中,不需要封装的类之间有任何联系,在具体应用时,down-cast时是类型安全的,并且不需要RTTI的支持。(有些开发环境为了提高运行速度,会把RTTI关掉的--这样大约有10%的性能提高)这个功能分两级实现的
2013-10-07 12:06:03
1019
原创 0) 原创的一套泛型源代码,用于改善STL的易用性,效率,功能增强。(拿出来和朋友们分享)
总结自己这些年来的编程经验,深感大家都不太爱使用成熟的泛型源代码算法,因为这些算法使用比较麻烦,有时甚至得不偿失,比如没有(时间/空间)效率优化,使用stl算法比自己写算法编程更慢(因为需要提供算法的配套接口),算法的功能不够。自己实现本来属于算法领域内的一些通用功能,有这样一些缺陷:1. 增加了代码工作量,降低开发速度。(自己做了库应该做的工作)2. 自己写枯燥的千篇一律的算法...
2013-06-14 04:10:55
974
[原创]自己工作中常用的模板库,简化你的工作
2015-10-12
注册表搜索工具有跳转工具
2013-10-09
正则表达式系统教程及实用的参考例子
2010-08-25
window命令手册(chm)
2010-08-25
CppReference.chm
2010-08-25
修复VS2003安装时的缺失文件h2inc.err等问题。(h2inc.err下载)
2010-02-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人