发布COM组件方式
本文介绍常用的几种发布COM组件的方式。 用注册表来注册组件 借助于注册表来注册组件,这样可以直接通过CoCreateInstance获取接口 注册表查找组件的CLSID支持两个路径: HKCU\Software\Classes\CLSID\{uuid-string} HKCR\CLSID\{uuid-string} 当调用CoCreateInstance时,先查找第一个注册表项,如果查找失败,再查找第二项。 注册信息可以直接在项目注册脚本.rgs文件中查 ...
It’s not what you know, it’s how you think
本文介绍常用的几种发布COM组件的方式。 用注册表来注册组件 借助于注册表来注册组件,这样可以直接通过CoCreateInstance获取接口 注册表查找组件的CLSID支持两个路径: HKCU\Software\Classes\CLSID\{uuid-string} HKCR\CLSID\{uuid-string} 当调用CoCreateInstance时,先查找第一个注册表项,如果查找失败,再查找第二项。 注册信息可以直接在项目注册脚本.rgs文件中查 ...
C++相对于C增加了三种特殊运算符来支持成员指针。::* 用于指针的声明,而 ->* 和 .* 用来调用指针指向的函数。另外,标准C++中还有一条有趣的规则是:你可以在类定义之前声明它的成员函数指针类型。 类型的实际对象和成员函数指针的分离也是实现委托的基础 下面的消息注册与分派的实现机制最终还是使用了成员函数指针及其调用的技巧。 同类型下 ...
当我们要提供可复用,高度灵活性的组件、类库等情况时,我们该如何着手?policy classes是一种重要的类的设计技术,能大大提高程序的弹性和可复用性,也是《C++设计新思维》作者Andrei Alexandrescu所推崇的技术。 策略policy的基本想法: 是把需要实现的类的一些相对独立的行为(behavior)提取出 ...
Json是平时常用的数据结构,对于C++ Native代码来说,选择一个优秀的json解析器对于应用来说十分重要。json_spirit是codeproject上比较热门的json解析器,具有优异的使用接口,以及不错的效率(用了boost::spirit::classic解析框架)。 先简单介绍JSON语法(JavaScr ...
关于STL算法的说明: 注意算法的返回值,特别是查找,删除,拷贝的函数通过返回值的形式来表达效果。 由于算法都是模板函数,所以传递的函数可以是普通函数(指针)或者函数对象,有了Lambda函数,STL算法如虎添翼。 注意使用特定算法的合适情况,熟练使用常用的算法。 容器自带的算法性成员函数说明: vector/deque/str ...
C++中“类型敏感的”模板函数重载依赖于SFINAE(substitution-failure-is-not-an-error,替换失败不是错误)。 SFINAE原则 在函数模板的实例化过程中,如果推断形成的某个参数或返回值类型无效,那么这个实例将从重载决议集中去掉而不是引发一个编译错误 而boost::enable_if使 ...
本文深入分析C++表达式模板的思想。 表达式模板的目标是: 创建C++中的嵌入式语言,boost.proto为我们搭好了这个框架,boost.xpressive就是嵌入C++的正则表达式,可以静态的生成正则表达式引擎,所有的正则表达式运算都被重载。boost.spirit也是嵌入C++的语言,可以直接用于EBNF语法解析, ...
本文整理了C++的转型运算,以及扩展常用的转型功能。 C++转型运算 dynamic_cast 具有动态多态特征的类型(具有virtual虚函数的)的继承体系中类型之间的转型,一般使用指针转型,因为使用引用转型会抛异常。 例子: #include <iostream>using namespace std; struct A { virtual void print() { cout << "A" << endl; } }; struct B { virtual void print() { cout << "B" << endl; } }; struct C : public A, public B {}; int main() { C c; A& ra = c; B* pb = &c; B* p1 = dynamic_cast<B*>( &ra ); if ( ...
C++模板扮演着重要的角色,所有的STL容器,算法,迭代器,适配器,所有的高级boost库都是用模板实现的。 C++模板用于两个不同的方面:类模板和函数模板(包括类的成员函数模板)。比如: 类模板:容器,迭代器,容器/迭代器的适配器,boost的shared_ptr, bind, function等 函数模板:所有的STL算法,函数(对 ...
本文分析C++对象的构造和析构语义。 OO与OB的比较 OB(Object-based):抽象数据结构模型(abstract data type model, ADT),把数据结构封装,提供public方法来使用,比如:STL中的vector,string等都是OB的范例,比起OO速度更快,空间也更紧凑,高效率是因为所有函数引发操作都在编译期解析完成, ...
本文详细介绍下C++11的右值引用的语言特性。 左值与右值的区分 左值与右值是表达式的属性,而不是对象的属性。例如: obj, *ptr, ptr[index], vect[n], ++i等表达式都是左值; 而1, x+y, i++, string(“zhenshan”)等都是右值。 左值是指某个表达式,它指定一个对象(对象的名字可有可无),并且该对象的生命期在该表达式语句之后。右值是指某个表达式,它 ...
本文详细介绍下C++11的lambda表达式的语言特性。 lambda表达式总体特点: Lambda函数作为临时的函数,最常要数用于STL算法了,我们的很多STL算法可以指定一个函数参数,比如:accumulate, for_each, find_if, count_if, search, mismatch, sort等几十个算法函数。C++0x以前我们必须用有名的函数或者函数对象(bind,not等组合) ...
boost::function_types提供了对函数签名、函数指针、函数引用和成员指针等类型进行分类、分解和合成的功能。而这些类型统称为可调用内建类型(callable builtin types)。 该库提供了一系列针对可调用内建类型的traits; 另外使用了tag 类型来对不属于类型本身的属性进行编码,如调用协定或函数是否为变长参数 ...
function库突出的能力是存储函数指针或者函数对象,并且自身成为函数对象,且能访问对应的函数(对象)接口。 传统的函数存储是通过函数指针(数组)来实现的,从而实现回调,function库是标准库的一个重要的扩展,为函数对象和函数指针提供了一样的接口来存储,优雅的实现回调,特别是带状态的函数对象以及用bind产生的临时 ...
bind在表达能力上可以取代所有的标准库配接器,如bind1st, bind2nd, not1, not2, mem_fun_ref, mem_fun, ptr_fun等,而且表达更统一,更清晰。 基本的语法 bind( func, argu_or_placeholder1, argu_or_placeholder2, ... ) 其中: Func:可以是函数指针、类成员地址、函数对象 argu_or_placeholdern:参数或者占位符(_n) 返回类型:函数对象,使用的参数由bind使用的所有参数共同指定。 ...