自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

申晓龙的专栏

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

  • 博客(32)
  • 资源 (7)
  • 收藏
  • 关注

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

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

2014-11-30 11:28:58 1380

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

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

2014-02-12 13:40:05 918

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

在既有代码中编程时,如果想对一个数据集(容器/数组)中的所有元素进行处理时,其处理函数一般只能接受一个参数--数据集的数据类型,而既有的接口可能需要多个参数--数据集的数据类型只是这多个需求参数中的一个参数。在通常情况下,如果想使用标准算法中的forEach算法,则需要就此功能另外再写一个函数/函数对象以把额外的参数封装在函数内部,或者直接自己遍历这个数据集,把既有函数中的代码Ctrl+C/Ctr

2014-02-12 10:55:11 1946

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

这些基于typeTraits提供的一些类型转换功能,比如典型的if-else等等,判断两个类型是否相同,是否原始类型相同,,是否可转换,是否值可转换,是否基类派生类,是否序列类,是否数组,是否是原子类型,是否是内置类型,是否是枚举类型。如果你的项目中允许使用boost这类重量级库的话,还是推荐你使用boost,下面的源代码提供了一个可供选择的替代方案:如果你不想引入boost这种巨无霸或者你的

2013-10-07 14:26:55 1955

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

源代码可以在我的资源中去下载(包括用法测试的源代码):https://github.com/ShenXiaolong1976/MiniMPL 只需要用VS建一个空的工程,然后引入我的测试头文件即可。然后测试函数会在main函数之前运行,在控制台窗口中可以看到输出。 这个源文件的功能是实现像MFC的动态创建的效果。 但是和MFC相比,这个功能有下列优势: 1.MFC的动态创建...

2013-10-07 12:41:17 1514

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

这个文件是和将多元函数转换为一元函数unaryFunctionConverter配合使用的,unaryFunctionConverter提供了转换的实现,但是使用起来不便,此文件functionCreater将这些转换封装成了makeUnaryFunction/makeBinaryFunction以方便使用,使用者只需要提供函数指针及必要的传入参数即可创建正确的一元/二元函数对象、#i

2014-02-12 11:32:56 1007

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

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

2014-02-12 11:21:44 1022

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

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

2014-02-12 11:09:10 814

原创 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 1214

原创 这是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 806

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

在C++的模板元编程中,如果使用了T::type , T::value , T::apply之类的语法,其将导致编译器立马对该类型表达式进行求值,有些时候,这些求值工作是不必要的,将增加编译器的编译时间,我们可以将之延迟到最后一刻确实需要进行类型计算的时候再去求值,此称之为Lazy evaluation。下面通过Lazy_If_T 为例演示了如何把一个非延缓评估的元函数转换为延迟评估的元函数-

2013-12-04 15:22:58 826

原创 产生及判断NaN及INFINITE数值

本人工作中经常需要用到NaN及Inf浮点数,原来使用是IBM公司封装的CDecfloat数据类型,后来发现这个数据类型的许多缺点:1. 数据类型size太大,浪费内存:这个数据类型用来表示浮点数,在x86 32位机器上竟然需要100多个字节。 (浮点数只需要4字节啊,IBM的大神们)2.   操作效率低下,来回和string相倒换,有时候完全没有必要。3. rescale后,原有的数值

2013-12-02 13:00:50 12083

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

如果走技术路线的话,那么C程序员,C++程序员,java程序员都在实践中追求什么呢??在保证正确性的大前提下,胡思乱想了一点儿,感觉如下:1。C程序员 : 玩算法,追求高效率,宜用于底层。2。C++程序员 : 兼顾效率,追求通用性及灵活性,宜用于做构架框架。3。java程序员:追求语法简单,语言本身封装了很多应用层的东西,易于上手,适宜于新手及快速开发。C语言是C++语言的

2013-11-13 19:50:55 1270

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

在模板函数中,很多情况下,我们仅仅需要一个对象的类型,而并不需要这个对象的实体,例如: templatetypenameT>void HandObject(){                couttypeid(T).name() <<endl;} 在调用时,用户必须明确地指定模板类型:HandObjectbigObject>();很多时候,用户并不喜欢这

2013-10-24 16:58:51 1207

原创 开始学习java

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

2013-10-24 16:51:37 785

原创 反转单向链表的实现

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

2013-10-14 09:36:14 983

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

以下内容来自于http://blog.csdn.net/v_JULY_v/article/details/6322882v_JULY_v博主提供了非常精妙的算法原理,佩服。但是我个人觉得算法的实现稍显麻烦,看那些算法的实现看得很头疼。我依据博主的算法,写出了下面的实现。实现原理:同博主所言,所谓的字符串左移/右移,就是交换字符串的两部分而已。所以下面的算法实现中,除了最终的一次

2013-10-11 09:45:39 1792

原创 编译期assert函数

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

2013-10-10 10:57:47 2861

原创 结构体对齐规则

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

2013-10-10 10:51:19 1143

原创 命名空间及匿名命名空间

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

2013-10-10 10:44:11 7762 3

原创 typeid及RTTI

C++中类型识别符typeid分静态识别和动态识别。静态识别是指在编译阶段进行的识别,动态识别是指在运行阶段进行的识别。只有动态识别需要RTTI的支持,但是RTTI是否打开不影响编译链接,只影响运行结果是否正确。  typeid的工作原理:1.       typeid是依赖于保存在虚函数表里面的type_info块来获取真实对象信息的。而如果基类没有任何虚函数的话,typeid就

2013-10-10 10:27:49 1466

原创 内部链接(internal linkage)和外部链接(external linkage)

内部链接(internallinkage)/外部链接 (externallinkage)是和编译单元(translation unit)相关的一个术语,其主要影响函数或者对象的作用域及存储方式—是全局只存储一个,还是全局有许多量的副本。具有externallinkage的变量可以被其它源文件使用,整个程序内有效,并且全局只有一个。具有internallinkage的变量只能被本transl

2013-10-10 10:23:12 4702 3

原创 遍历所有时区的代码[windows]

window要没有提供遍历时区的代码,只提供了一些接口,让用户自己从注册表中遍历。比较麻烦,下面代码把这个功能封装了一下,让用户可以比较简单地处理所有时区。其中字符串用的是core::cstringex,大家可以用STD里面的字符串来代替,core::datetime里的数据结构体和SYSTEMTIME一样,大家可以把SYSTEMTIME封装一下就可以替换它了。//timezone.h

2013-10-10 10:15:47 1339

原创 简单地使用sym*函数族导出函数栈(Based on x86)

在有时我们需要导致当前线程的函数栈调用,但是我们又不期望自己来实现这个功能,下面的源代码可以帮你解决。导出函数栈其实就是sym*函数族的应用,该函数在dbghelp.dll中的,下面只是实现了简单的用法,使用的缺省的符号搜索路径,没有设置用户自定义的搜索路径:这样有两方面的考虑: 1. 这不是一个GUI程序,不想让使用者觉得麻烦,这里更合适的说法是提供了一个函数供用户调用。2.一般

2013-10-08 11:05:50 1314

原创 9) 泛型数学运算符函数mathOperator [原创,泛型编程,自由下载转载,需注明出处]

下面是一些算术操作符,其通常作为一些接口的比较参数传入。泛型的。#ifndef mathOperator_h__#define mathOperator_h__#include "typeConvert.h"/********************************************************************Descr

2013-10-07 14:34:20 952

原创 1) 获取类型特征typeTraits [原创,泛型编程,自由下载转载,需注明出处]

由于在我们的项目中,不能使用std及其它的主流库(boost等),在需要判断一些类型特征及类型转换时,就只能自己写这些功能了。这面是这些功能的实现(当然boost实现得更好:如果你的项目中允许使用boost这种重量级的库时,那么还是推荐你使用boost,如果不能,那么这些源代码可供替代使用)#ifndef typeTrait_h__#define typeTrait_h__#i

2013-10-07 14:18:50 1142

原创 14) 常用的遍历/(条件)查找/收集数据/(拷贝2比较优先)排序算法algorithm [原创,泛型编程,自由下载转载,需注明出处]

下面的一套算法,配合前面提供的泛型库的支持部件,能够提供下列基于概念的功能:1.遍历处理2.统计计数3.查找4.最大/最小值5.收集 : 收集的结果可以是任何形式的:数组/容器,T/T*,并且调用接口是完全相同的(减轻用户负担),代码内部会自动进行类型识别。6.累加7.排序7.1)  用户可以指定执行方式是比较优先/拷贝优先/缺省自动  7.2) 按参照顺序排序

2013-10-07 14:13:17 1208

原创 13) 参数适配ParamterWrapper [原创,泛型编程,自由下载转载,需注明出处]

我们在写C++接口时,通常会有下列参数形式:1. T, T&以出于不同的需求,比如对于一些内置参数,由于其复制很高效,T及T&没有什么大的区别,我们就可以使用T形式;但是对于一些比较大的对象,如果用T,则传递过程中会构造临时对象出来,浪费效率;或者对于一些不可复制对象,使用T根本编译不过,就需要使用T&形式;对于一些C程序员2. 或者部分C++程序员来说,可能会使用T*形式,但是这样,就把

2013-10-07 13:52:58 960

原创 11) 为STL容器和数组提供统一的接口DataSet [原创,泛型编程,自由下载转载,需注明出处]

在一些产品上,对于数据块,有些人喜欢用数组,比较典型的C程序员,有些人喜欢用STL容器,对于框架操作,我们通常希望存取这些对象能够使用一套统一的接口去存取它,因为从概念上讲,它们无非就是一组数据的集合,我不关心存取它们方式的不同,只需要给我一个,存入一个数等。为了满足这些需求,下列源文件提供把C数组和STL容器做了统一的封装,以提供一样的接口。(没有提供查入/删除接口)#ifndef

2013-10-07 13:34:49 956

原创 9) 常用函数对象functionobject [原创,泛型编程,自由下载转载,需注明出处]

在使用STL算法时,第三个参数通常是一些函数对象。这样,我们为了使用STL提供的算法函数,就不得不提供一些零碎的,小的函数对象,有可能这些函数对象仅仅这只这一处使用,我们就不得不写这样一个函数对象类。大多数时候,这个函数对象提供的功能可能非常简单,比如说就是根据结构体里的某个子结构体的某个子成员值相比较,或者满足某种大小的需求,这类需求功能从概念上讲是一样的,但是实现起来,就不得不一一书写这些琐碎

2013-10-07 13:25:50 920

原创 12) 类型安全的任意类CAnyObject [原创,泛型编程,自由下载转载,需注明出处]

anyObject.h , 这是泛型库中13个源文件中的一个,不知道csdn有没有自动上传源代码的功能,有知道怎么用的朋友请告诉我一声。这个源文件可以封装任意类到一个共同的类中,不需要封装的类之间有任何联系,在具体应用时,down-cast时是类型安全的,并且不需要RTTI的支持。(有些开发环境为了提高运行速度,会把RTTI关掉的--这样大约有10%的性能提高)这个功能分两级实现的

2013-10-07 12:06:03 975

原创 0) 原创的一套泛型源代码,用于改善STL的易用性,效率,功能增强。(拿出来和朋友们分享)

总结自己这些年来的编程经验,深感大家都不太爱使用成熟的泛型源代码算法,因为这些算法使用比较麻烦,有时甚至得不偿失,比如没有(时间/空间)效率优化,使用stl算法比自己写算法编程更慢(因为需要提供算法的配套接口),算法的功能不够。自己实现本来属于算法领域内的一些通用功能,有这样一些缺陷:1. 增加了代码工作量,降低开发速度。(自己做了库应该做的工作)2. 自己写枯燥的千篇一律的算法...

2013-06-14 04:10:55 929

[原创]自己工作中常用的模板库,简化你的工作

这上传的资源中包含一套我工作中常用的模板库,及不需要MFC支持的excel操作接口,导出函数调用栈(dump stack)接口,可以直接用VS2008运行TestCodeLib.sln来根据unit test来了解用法。 ⑴ 需求(requirements) 重量级的BOOST非常强大,但有时候项目中没有引入它,这时候我们需要自己的模板库。 BOOST is very powerful, but some projects have not include BOOST library. So we need out own template type trait library -- it is the responsibility of this lightweight library. 即使BOOST非常强大,但有些常用的功能其也没有,而经常性的代码中又需要这些功能。比如把运行期数据转换为元程序需要的编译期数据。 Even if BOOST is very powerful,it can't still meet all requirements. e.g. convert runtime data into compile period data needed by metaprogramming. /*************************************************************************************************************************************/ ⑵ 益处(advantage) 此泛型库抽象了一些常用的业务需求,可以避免大量的重复工作。 它是完全泛型的并且是类型安全的(没有强制类型转换),如果使用错误将导致编译失败,从而提高了正确率(正确性由编译器保证)。 这个库的很多模板类型推导不需要C++11的支持,这是一个大的优势(VS2010才开始支持C++11)。 this general library draws out some common business and avoid unnecessary repeat work. it is completed general and type-safe(without any type cast), mistake(s) will cause compile failure, so it improves correctness. In this library , type deduce need't C++11's support, it is big advantage. (VS2010 begin to support C++11) /*************************************************************************************************************************************/ ⑶ 用法(usage) 下载这个库后,使用VS打开.\CodeLib\testcase\TestCodeLib\TestCodeLib.sln,直接按F5启动,即可以看到许多单元测试的用法/测试用例的输出。 如果需要使用某功能,可以参考其对应的测试代码的用法。(每个功能文件.\CodeLib\include\MiniMPL\xxx.hpp,都对应一个测试文件.\CodeLib\testcase\MiniMPL\test_xxx.hpp) (这个库的使用及修改是完全自由的,只需要保留文件头中的注释即可) usage: download this library, open .\CodeLib\testcase\TestCodeLib\TestCodeLib.sln with VS,you can see many usage/test output of unit test. every feature has according unit test file, it shows its usage. e.g. .\CodeLib\include\MiniMPL\xxx.hpp has according ".\CodeLib\testcase\MiniMPL\test_xxx.hpp" this library is all free, the only requirement is that you need to keep the comments in header file. /*********************************************************************************************************************************************************/ ⑷ 本库提供的主要功能介绍: major feature in this lib: ◆ [typeTraits.hpp] ★ 测试类型的基本属性,比如IsConst/IsVoliate/IsRef/isAtomType/isBuildInType/isEnumType/IsIterator/IsPointer/isString/isInnerFloat/isArray/IsBaseDerive/.... ★ 转换类型的基本属性,比如AddConst/AddVoliate/AddRef/AddPointer,..,RemoveConst/RemoveVoliate/RemoveRef/RemovePointer,... 这类功能是元程序库的基本支持组件,其它库(比如boost)也提供了,但本库时提供的检测属性更多。 ☆ detect type property. e.g.IsConst/IsVoliate/IsRef/isAtomType/isBuildInType/isEnumType/IsIterator/IsPointer/isString/isInnerFloat/isArray/IsBaseDerive/.... ☆ convert type basic qualifier,e.g. AddConst/AddVoliate/AddRef/AddPointer,..,RemoveConst/RemoveVoliate/RemoveRef/RemovePointer,... get type traits.e.g.const/voliate/ref/isAtomType/isBuildInType/isEnumType/isString/isInnerFloat/isArray/IsBaseDerive/.... It is base support component of metaprogramming system,it is similiar with BOOST , but this lib provide more. ◆ [typeConvert.hpp] ★ 实现类型的修饰符转换。比如让输出参数类型的修饰符(const/voliate/ref/*)和输入参数类型的修饰符一样。 SameConst/SameVoliate/SameRef/SamePointer/SameAllQualifier/RefAdapter 应用场景:存取结构体的某类成员,当输入参数有某种const/voliate/ref修饰符时,通常要求返回值也有类似的修饰符。 ★ 当把"智能指针/stl迭代器/C指针/前三者嵌套"都视为指针时,其内的最终值(非指针值)是一致的,在模板函数中,某些场景需要取得其最终的非指针值。 应用场景:转发模板函数,如 template<typename T> void transmit(T p) { receive(p); } //void receive(int&); 如果transmit的传入实参p为指针类型(比如smartpointer<vector<int*>::iterator>*或者vector<int*>::iterator), 但是转发的接收函数receive的形参为非指针类型(比如int&),理论上是可以实现转换的。 Get::finalValue接口提供了这种自动的转: template<typename T> void transmit(T p) { receive(Get::finalValue(p)); } ☆ Convert type qualifiers,e.g. addConst/removeConst.. , keep same output qualifier (const/voliate/ref/*) with input type. apply scenario: get member of one structure object. ☆ Think "stlSmartptr<T>/StlContainer<T>::iterator/T*" as pointer, their inner non-pointer value is same. in some scenario, the final non-pointer value is needed. e.g. template<typename T> void transmit(T p) { receive(p); } //void receive(int&); if real paremeter "p" is smartpointer<vector<int*>::iterator>* or vector<int*>::iterator , but needed parameter by "receive" is int&, in theory it is OK. Get::finalValue provide this conversion: template<typename T> void transmit(T p) { receive(Get::finalValue(p)); } ◆ [traverseTypeSet.hpp] ★ C++语法不支持模板函数/模板成员函数作为回调函数。本库采用了封装,可以支持模板函数的回调,并且支持最多7个可变参数(可以简易扩充参数个数)。 可以遍历一个TypeList或者枚举值范围CEnumRange,然后以满足条件的类型回调用户的模板函数。 其广泛的应用场景即是把运行期数据以一种非hard-code的方式转化为编译期数据,从而满足元程序对编译期数据的需求。 ☆ C++ doesn't support template-based callback function. this lib package support template-based callback function(MAX 7 various parameters,easy to expand). It can traverse one TypeList or enum value , then call user's template function by suitable type/enum value. This feature converts runtime data into compile data to meet metaprogramming requirement without hard-code way, it is one big advantage. ◆ [functionTraits.hpp] ★ 获取任意类型函数的各种特征,比如函数的所有参数Params_T,返回值类型Return_T,对象类型Object_T(如果是成员函数),第N个参数的类型GetFunctionParam<F,N>, 这些类型都是包含修饰符(const/voliate/ref)的完整类型。 这些组件对于操作函数非常重要。 ☆ get some traits of any function, include all parameter type "Params_T",return type "Return_T", host type "Object_T"(if member-function) , No.x parameter type "GetFunctionParam<F,x>". this type include all signature qualifiers. This component is very important for metaprogramming based on function. ◆ 有时候STL的算法并不好用,经常是为了第三个参数需要自己写一个专用的琐碎的小函数。 虽然可以用std的bind或者boost的lambda,但是对于某些嵌套情况,用起来非常麻烦,这个库提供了下面的一些解决方式: sometimes STL algorithm is not good and it needs one traival function object(third parameter) , althrough std::bind/boost::lambda is available, but for some nest case, it is very hard to be used.this library provide below features: [function.hpp] ★ 把既有的多元函数转换为一元函数对象UnaryFunction。它通常应用于泛型(比较/排序/遍历)算法的第三个参数。 ☆ convert existing multi-parameters into unary function, it is general used as 3rd parameter in general algorithm. e.g. stl::for_each [functionobject.hpp] ★ 把一些常用目的的函数封装成函数对象,比如"比较器/测试器" ☆ function object with special abstract targart. e.g. "comparer/Tester" ◆ [functionCreater.hpp] ★ 把多元函数封装为一元函数的帮助函数。(一元函数对象的类型通常不易于书写) ☆ helper function to pack multi-parameters into unary function.(it is hard to write unary function object type) ◆ [paramPackage.hpp] ★ 实现了把任意多个(最多7个,可简易扩充),任意类型的参数封装成一个参数以利于数据传递。 ☆ pack any number parameter (max 7,easy expand) into one parameter . it is easy to transfer. ◆ [classregister.hpp] ★ MFC的动态创建不是泛型的,创造出来的对象必须是CObject的派生类,而且支持的创造方式单一,不够灵活有时候甚至不能满足需求。 本库里提供了一个泛型的动态创建方式,可以以多种灵活的方式甚至用户自定义的方式来匿名动态创建对象,创建的对象基类可以由用户指定(必须存在派生关系)。 ☆ like MFC's DYNAMIC_CREATE, but the one of MFC is not general,the instance MUST be drived from class CObject, MFC dynamic creation has only one create way,sometimes it is not enough。 this library provides general dynamic create way, can create object by multiple ways , even customized way.and base class can be specified by user. ◆ [callbackWorker.hpp] ★ 最易于使用的回调函数是无参数的回调函数。 此功能可以把任意多个参数的多元(成员/非成员)函数封装成一个无参数函数,作为简单的回调函数。 ☆ best callback function is non-parameter function. This feature packs multiple-parameter function into one no-parameter function, it is easy to be used as callback function. ◆ [memberPtr.hpp] ★ 以统一的方式实现了任意级数的结构体成员的存和取,比如多级结构体嵌套。例子:a.m_b.m_c.m_d.....m_x,非常易于在模板设计中使用。 ☆ access any level member of structure object by one unified way. e.g:a.m_b.m_c.m_d.....m_x,it is easy to be used in template componment. ◆ [anyObject.hpp] ★ 任意对象类(CAnyObject)。提供模板化的指针操作符,如果不支持用户指定指针类型,则转换结果为NULL,从而保证正确性。 ☆ package any object(CAnyObject), it operator function is template-based. if it doesn't support conversion, it return NULL. ◆ [dataset.hpp] ★ 把STL容器和经典数组封装成统一的形式,在使用上不再区别对待。对于C数组,将会自动检测越界情况。 ★ 可以使用初始化列表对数组,STL容器进行(反复)初始化。例如:vector<int> a={1,2,3,45,2}; ☆ pack STL container and class array into unified object with several same interfaces. ☆ can initialize array/stl container with initalization list repeated. e.g. vector<int> a={1,2,3,45,2}; ◆ [macroLoop.hpp] ★ 当多条语句的差别仅仅是一个数字时,可以利用提供的循环宏简化成一条宏语句,从而简化书写。用法可参见对应的单元测试例子。 ☆ if only one number is different in multiple statements, can use one macro loop to simplify them (one macro statement) usage refer to unit test. ◆ [mathOperator.hpp] ★ 泛型的数学操作符。"equal/lesser/NotBinary/NotUnary/notEqual/lesserEqual/greater/greaterEqual及交换函数swap/swapif" ☆ general math operator. "equal/lesser/NotBinary/NotUnary/notEqual/lesserEqual/greater/greaterEqual and swap/swapif" /*************************************************************************************************************************************/ ⑸ 感谢及借鉴: 本库中的占位符[placeHolder.hpp]借鉴于boost库,感谢boost库的大师们的灵感。 typelist来自loki库,但是把命名空间Loki改为MiniMPL以避免频繁的命名域切入/切出,感谢Andrei Alexandrescu的精彩演绎与启发. thanks and borrow: Args [placeHolder.h] comes from BOOST::MPL. thanks for BOOST team. typelist comes from loki lib with tiny modification(rename namespace loki to MiniMPL to avoid field switch frequently).thanks for Andrei Alexandrescu

2015-10-12

注册表搜索工具有跳转工具

对于经常和注册表打交道的朋友,搜索注册表时往往希望一次性地把所以满足要求的内容搜索出来,而OS处事的注册表不知道得按不少次的F3来执行。这时可以使用regfind来帮助你,regfind是一个命令行工具,可以一次性在把满足搜索条件的所有注册表内容列出来。 如果搜索到了这些内容,有时候也想快速地跳转到指定注册表处,可以使用regjump直接跳转过去。

2013-10-09

正则表达式系统教程及实用的参考例子

正则表达式系统教程: 系统的学习正则表达式。 学习了正则表达式,但新手往往还无法使用,其实附带的实用例子,则可以为你提供太多的帮助了。 如果你不知道正则表达式是什么,那么你就不用看了。

2010-08-25

window命令手册(chm)

编程两大利器之一:C/C++参考手册,提供语法函数参考(参见我的另一资源)。 编程两大利器之二:window命令参考手册,用于了解window工具名称,用法,编制bat/shell脚本,替换你频繁的复杂手工重复劳动。

2010-08-25

CppReference.chm

和目前网络上流传最广的C++参考手册(STL).chm(经典版)相比,这个资源具有下列优势: 1.同样的信息量,本文件只有262K,而经典版有1.13M。 2.经典版的索引罗列混乱不堪,可以用糟糕形容。此资源分类清晰,条文清楚,令人耳目清新。 本人也在这行干了不少年头,下过不少电子书,最终对比总结留下来的C/C++参考手册,只有这一本。其它的基本上都抛弃了。 相信下过的同仁下载后不会后悔。

2010-08-25

VC助手(10.5.1738)

当前最新版VC助手。2010.2.9号 用于VS2008.net

2010-02-09

修复VS2003安装时的缺失文件h2inc.err等问题。(h2inc.err下载)

VS2003安装时,会出现下面的缺失的文件,此修复包修复了些bug: ML.exe ML.err H2inc.exe H2inc.err Win.inc Readme.txt Errmsg.txt Support.txt 概括的说来,此修复包解决了下面VS2003中下面的一些bug: - 32-bit Linker Errors - ML Errors Update - Microsoft MS-DOS Extender Run-Time

2010-02-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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