- 博客(22)
- 资源 (2)
- 收藏
- 关注
原创 模板之泛化仿函数(二)
实现 STL 的 BindFirst 功能假设有个 Functor 取两个整数作为参数,你想将其中一个整数绑定为固定值,只让另一个变化。绑定会产生出一个”只取单一整数“的 Functor,如下:void f(){ // Define a Functor of two arguments Functor cmd1(something); //
2014-11-29 21:32:42 897
原创 模板之泛化仿函数(一)
1 泛化仿函数的要求参数个数应该是任意的,参数的型别也应该是任意的。// 我们的Functor 应该是这样的,Functor 只是一个 wrapper(外覆类) template class Functor{public: ResultType operator()(); // 转发函数 ResultType operator(Parm1 p1); ResultT
2014-11-29 17:48:21 2534
原创 成员函数指针
成员函数指针的行为含香函数指针,但你想调用他们时,除了参数之外,你还必须传递一个对象。class Parrot{public: void Eat() { cout << "Tsk, knick, tsk..." << endl; } void Speak() { cout << "On Captain, My Captain" << endl; }};int m
2014-11-29 12:01:56 741
原创 Singleton(一)
1 用以支持 Singleton 的一些 C++ 几基本手法// Header file Singleton.hclass Singleton{public: static Singleton* Instance() { if (!pInstance_) pInstance_ = new Singleton; return pInstance_; }private:
2014-11-29 11:38:26 789
原创 编译错误模板参数太多的几种情况
编译器报错:模板参数太多的错误1 C++ 不允许同名而参数个数不同的 templates 存在templateclass Functor{};template class Functor{};2 特例1:模板的偏特化与模板原型声明的模板参数个数不同// 模板原型templateclass Functor{};// 模板的偏特化,增加了参数 Parm1te
2014-11-26 13:33:08 8383
原创 Command设计模式
Command对象是一个“和其实际执行着分开存储”的组件。其重要目的是降低系统中两个部分(请求者 invoker 和接收者 receiver )之间的依存性。 典型的行为次序: 1 客户端产生一个 ConcreteCommand 对象,并传给它足够信息以备执行某项任务。 2 客户端将 ConcreteCommand 对象中的 Command 接口传给 invoker(请求者),由它保存这个接
2014-11-24 19:15:20 802
原创 return 和 exit
1 return的作用:释放局部变量(会调用局部对象的析构函数),并弹栈(即释放其所在函数申请的栈),并回到其上级函数。 2 exit的作用:exit 不是系统调用,是glibc对系统调用_exit 或 _exitgroup() 的封装。不做任何清理栈的操作,只返回到操作系统(即结束进程,进程申请的堆栈由操作系统清理)。 3 return 和 exit 在 main 函数中使用:
2014-11-22 10:33:01 724
原创 模板之TypeTraits
Traits 是一种 “可用于编译器根据型别作判断” 的泛型技术,像在执行期根据数值执行判断一样。Traits 好处:可以在 ”型别确立当时“意外的其他地点做出与型别相关的判断。这会让代码变得比较干净,更具可读性
2014-11-20 12:27:38 732
原创 typename关键字
在 template declaration(模板声明) 中class 和 typename 有什么不同?1 class 和
2014-11-19 15:10:27 798
原创 非静态成员函数的非法调用错误
1 静态成员函数相当于全局函数,只有一个类名字空间的限制。2 类成员函数式成员内部的函数,同一个累的对象实例有很多,每一个实例都有自己不同过得成员变量值。每个实例通过成员函数来操作其成员变量。所以成员函数的调用必须明确的指出是哪一个实例对象在操作。3 静态成员函数是类的函数,无需指明是某个实例
2014-11-18 20:10:47 28634
原创 模板之型别选择
问题:在NiftyContainer 例子中,也许以一个std::vector 作为后端存储结构。面对 polymorphic 型别,不能存储其对象实体,必须存储其指针。但如果面对 non-polymorphic 型别,可以存储其实体,比较有效率。这时,vector 还是 vector 需要根据 isPolymorphic 来决定 ValueType 定义为 T * 或 T。方法1:可以选择
2014-11-18 15:11:58 920
原创 模板之型别对型别的映射
假设 Widget 类定义是我们不能修改的类型:class Widget {public: Widget(int arg, int i = -1) { } ....};现在
2014-11-18 10:33:31 747
原创 模板之长整数映射为型别
Int2Type会根据引数所得的不同数值产生不同的型别。这是因为“不同的 template 的具现体”本身是“不同的类型”。因此 Int2Type 不同于 Int2Type,以此类推。用来产生型别的那个数值是一个枚举值。符合下列两个条件便可使用 Int2Type:1 有必要根据某个编译期常数调用一个或数个不同的函数2 有必要在编译器实施“分派”(dispatch)执行期的分
2014-11-17 22:57:25 857
原创 模板的偏特化
template class Window, class Controller>class Widget{ ....};// 特化// 其中 ModalDialog 和 MyController 是另外定义的 classtemplate<>class Widget{ ....};// 偏特化// 其中 Window 是泛化类型参数
2014-11-12 10:01:23 790
原创 C专家编程-数组和指针并不相同
1 数组并非指针 extern int *x; extern int y[]; 第一条语句声明x是个int型的指针;第二条语句声明y是个int型数组,长度尚未确定(不完整的类型),其存储在别处定义。 file1: int mango[100]; file2: extern int *mango; // 程序无法运行 更改为 extern int mango[]; //OK,声明与定
2014-11-07 14:28:09 614
原创 C专家编程-分析C语言的声明
1 理解C语言声明的优先级规则 A 声明从它的名字开始读取,然后按照优先级顺序依次读取。 B 优先级从高到低依次是: 1 声明中被括号括起来的那部分 2 后缀操作符:括号() 表示这是一个函数,而方括号[] 表示这是一个数组。 3 前缀操作符:星号* 表示“指向…的指针” C 如果const 和(或)volatile 关键字的后面紧跟类型说明符(如int,long等)
2014-11-07 11:22:56 847
原创 C专家编程-整型提升与寻常算术转换
1 字符和整型(整型提升) 如果char、short int或者int型位段(bit-field),包括它们有符号或无符号变型,以及枚举类型,可以使用在需要int或者unsigned int的表达式中。如果int可以完整表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。这称为整型提升。 2 寻常算术转换 许多操作数类型为算术类型的双
2014-11-06 12:54:54 725
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人