奇特的递归模板模式(CRTP)
CRTP(Curiously Recurring Template Pattern)是借助模板和继承来实现的一种技巧。 基本特征 // 注意X本身也可以是模板类型 classX : public base<X> { //… }; X的基类是一个模板特化,而该模板特化的实参为X X派生自一个了解自己的base<X>类,因此形成一种特殊的继承关系。 这种模式的最主要的一个功能是可以帮助自动生成成员函数,首先 ...
It’s not what you know, it’s how you think
CRTP(Curiously Recurring Template Pattern)是借助模板和继承来实现的一种技巧。 基本特征 // 注意X本身也可以是模板类型 classX : public base<X> { //… }; X的基类是一个模板特化,而该模板特化的实参为X X派生自一个了解自己的base<X>类,因此形成一种特殊的继承关系。 这种模式的最主要的一个功能是可以帮助自动生成成员函数,首先 ...
传统的联合union,只是对POD(Plain Old Data)类型有效,不可以使用带有非平凡构造或析构的类型。如果我们需要使用自定义的class作为联合的某个类型,union无计可施。而在C++领域,使用联合时很有可能涉及到使用非POD的类型。 variant 类模板是一个安全的、泛型的、基于栈的、可识别的高效联合容器,为以统一风格操作异 ...
标准库std名字空间中已经增加了type_traits的库,基本上它与boost的type_traits库一致。现在就来介绍下type_traits的一些特点和用处,还有就是boost库中的内置的traits的使用清单,用它们来协助泛型编程,能大大提高工作效率,而且还有静态断言static_assert在编译期假设一些 ...
tuple库的基本想法: 把给定数目的不同类型的元素统一管理起来,是标准库中pair管理二元类型的一个延伸。并且提供了很好的、统一的构造、赋值、绑定、读取等接口。附带了一个自然的好处,函数可以返回多个值 tuple库的内在实现,使得我们可以写元程序(Metaprogramming),即:Tuple库除了优美的基本使用外,还 ...
spirit.Qi (namespace boost::spirit::qi)是强大高效的语法分析器,spirit(boost版本1.41以上)对传统的spirit库进行了彻底的改写,传统的spirit库为现在库的一部分Classic而向后兼容,其他几个新内容:Q1, Karma, Lex 和 Phoenix。本文介绍分析器Qi,它和Karma是相对的孪生兄弟,一个用于解析,另 ...
介绍三种最常用的智能指针: shared_ptr:对象生成期自动管理,基于共享所有权(适合用于标准库容器) weak_ptr:安全观测共享资源,配合shared_ptr intrusive_ptr:带有一个侵入式引用计数的对象的共享所有权。 介绍 shared_ptr( <boost/shared_ptr.hpp> ) shared_ptr类的实现说明 主要的几种构造函数 template<classY> explicit shared_ptr(Y * p = 0); // 注:p指向 ...
boost::result_of模板用于识别函数(对象)返回类型,帮助确定一个调用表达式的类型。 result_of 给定一个类型 F 的左值 f 和类型 T1, T2, ..., TN 的左值 t1, t2, ..., tN,类型 result_of<F(T1, T2, ..., TN)>::type 定义了表达式 f(t1, t2, ...,tN) 的类型。 允许类型 F 是函数指针、函数引用、成员函数指针或类类型。 缺省情况下,N 可以是 0 到 10 之间的任意值。要修改上限,请定义宏 BOOST_RESULT_OF_NUM_ARGS 为 N 的最大值。 ...
在文本处理过程中常常格式验证、文本替换、文本格式化等,这时使用正则表达式就非常方便。C++标准库(TR1)已经引入了std::regex,基本是按照boost::regex来实现的。 使用regex库首先需要了解正则表达式规则,另一方面,regex库功能很强大,但是内容也很多。 regex类的基本使用,头文件<boo ...
boost::ref是为了实现模板推断过程中的实现通用的引用方式传递,以减少拷贝带来的副作用。 背景 模板函数的推断中,对于普通的模板参数,推断出的是普通的类型,不是引用类型,这就导致额外的拷贝性能流失,例如: template< typename T > void fun( T t ) { cout << t << endl; } 当调用时,fun( string("hello") ); T被推断为string,有拷贝。 为了减少拷贝,我们可以显式的 ...
preprocessor是强大的预处理元编程库,构建了一套预处理期间的数据结构和迭代控制流。 宏的基础知识 宏定义 #define identify replacement_list 定义的identify为宏名,后续文本中出现的identify都会被预处理器替换为对应的replacement_list。 #define identify( a1, a2, …, an ) replacement_list 类似函数的宏,是 “预处理阶段的元函数”。每个ai标识符命名了一个 ...
本文介绍两种字符串查找算法,KMP模式匹配以及python的fastsearch代码。 KMP模式匹配解析 先从最传统的子字符串匹配引出: #include <iostream>using namespace std; // 从原字符串src中,完全匹配首个pattern字符串 int Index( string const& src, string const& pattern, int pos = 0 ) { if ( src.size()-pos < pattern.size() ) return -1; int i = pos; int j = 0; while ( i<(int)src.size() && j<(int)pattern.size() ) { if ( src[i]==pattern[j] ) { ++i; ++j; } else { // i前进了j次++,i要回溯到 ...
模板的递归实例化可以分为类模板和函数模板两种。关键是形成依赖,基本内容是编译期类型和常整型值的计算(或者借助于模板函数类型推导)。 类模板 对于类模板来说,使用自身的模板特化(模板参数递进)的成员而形成依赖,导致模板类递归实例化,需要用类模板的特化来指定递归终点。 例子(编译期判断素数及打印): #include <iostream>using namespace std; template< int N, int P, bool Flag > struct Check; template< ...
普林斯顿大学校友、亚马逊CEO杰夫·贝索斯(Jeff Bezos)在2010年学士毕业典礼上发表演讲。他追忆了自己的幼年岁月,讲述自己如何在儿时懂得了“善良比聪明更难”的道理;分享了16年前自己决定放弃优厚工作、创建亚马逊时的复杂心路。“追随内心的热情”是贝索斯给精英人才的建议。他认为,是一个个的选择最终塑造了我们的人生 ...
本文介绍一些使用C++配接器以及实作仿函数的方法,要较好的使用STL中的functor,自己也要最好按照源码的标准格式写仿函数;配接器使仿函数的使用更加灵活,首先理解和使用,然后自己也学习和实作适合自己特殊要求的配接器。 bind1st 和 bind2nd #include <iostream>#include <functional> using namespace std; template< classT > struct func : public binary_function< T, T, T> { T operator () ( T t1, T t2 ) const { return t1-t2; } }; int main() { cout << bind1st( func<int>(), 10 ) (4) << endl; //10-4 cout ...
三阶魔方入门的玩法(层先法)复原的基本步骤示意图: 第一步:底棱归位(又称底部架十字,底层四个棱块正确复原的过程) 图1魔方底层架十字可以无师自通,只是我们这一步要复原的四个棱块的相对位置顺序要注意,由于我们以白色中心块做底层,按照我们现在的主流魔方的贴纸的帖法(上黄下白,前蓝后緑,左橙右红),如果我们先复原了白蓝这个棱块 ...