Enterprise Just Builder

Solution for Enterprise Software Architecture

stl

将 Win32 枚举型 APIs 转换为 STL 迭代器

原文1

操作系统都有许多 API 用于存取实体集合的,比方说 Unix 的 opendir()/readdir() 函数。Win32 API 也提供了许多函数用来枚举集合内的元素,通常采用的模型无外乎下面几种:回调函数 (如 EnumChildWindows), get-first/get-next (取第一个/取下一个 比如FindFirst/NextFile), 或 get-nth (取第n个 如 RegEnumValue) — 其语义和前二者完全不同。

现在 C++ 社区正在逐步朝着符合 STL 的通用编码格式迈进,如使用容器 (序列和关联)、迭代器、泛函 (或函子或函数对象)、算法和适配器等等。这一做法的最大好处是可以采用一种通用的方法操纵不同的实体, 大大减少开发者的工作量, 同时提高健壮性、可维护性和重用。

STL 技术未被广泛运用的原因之一是除了标准库所提供的类和函数 (list, vector, for_each 等) 之外, 缺少可用的 STL 兼容库, 特别对于操作系统 API。原因之一是这涉及编程模型之间迁移转换的复杂性, 特别是对于集合和序列。本文通过将两种 Win32 枚举模型实际转换 STL 序列, 创建封装了 Win32 API 的轻量级序列类, 并提供了可按 STL 标准算法来操纵枚举实体的迭代器。

本文所演示的类是 WinSTL 库的一部分,WinSTL 则是 STLSoft 的子项目。STLSoft 是个开源组织,一直致力于将 STL 概念运用到多种技术和操作系统中去。

>>> 阅读全文

 

, , , ,

C++ 模板编程入门 (一)

于天生的畏惧,大多数 c++ 程序员都尽量远离模板技术,反对的声音有:

  • 模板难以学习和运用
  • 编译时的错误信息模糊又冗长
  • 不值得花费精力

我承认模板都有点难以学习、理解和运用。但是从模板中获得的益处会多于其负面影响。许多泛型函数或类都可以被模板所包装。我后面会加以解释。

虽然从技术上来看 c++ 模板与 STL (标准模板库) 是同门兄弟。不过在本文中,我将只涵盖模板的核心部分。在下一篇文章中,我会阐述更高级且有趣的模板技术以及使用 STL 的一些诀窍。

语法
你可能已经知道,大部分模板都使用尖括号:小于号(<)和大于号(>),其使用形式总是如下所示:

< Content >

这里的 Content 可以是:

>>> 阅读全文

 

, ,

你应该了解的 10 个 C++ 11 的新特性

文章评价:

本文 1对一些 C++11 标准中的新功能进行了探讨。这里我建议所有 C++ 开发者应该学习和使用这些特性。C++ 11 增加了许多语言特性和标准库,本文涉及的不过是皮毛。不过,我相信其中的一些新特性应该为所有的 C++ 开发人员所熟知,并在日常工作中普遍使用。网上可以找到很多类似的文章,涉及不同的 C++11 特性。这里我尝试将一些应该经常使用的 C++11 新功能串联起来。

auto
在 C++98 标准中,auto 关键字就用在存储期规范中(Storage duration: 定义了对象在内存中的最小生存时间。最常见的存储期是自动存储期:在堆栈上分配的对象是自动分配和自动释放的)。在新的 C++11 标准中,其新用途是类型推断(Type inference)。auto 现在变成了类型占位符,它告诉编译器,应该从变量的初始化式中推断出它的实际类型。auto 关键字可以在不同的作用域中声明变量如:名称空间、块、for 循环语句的初始化声明等等。

auto i = 42;        // i 为整型
auto l = 42LL;      // l 为 long long 型
auto p = new foo(); // p 为 foo* 指针

使用 auto 意味着减少代码。(除非是 int 型,这样比 auto 要少输入一个字母)。回忆以前为了遍历 STL 容器元素,你会使用 typedef 来简化迭代器的编写,现在这种方法落伍了。请看:

std::map<std::string, std::vector<int>> map;
for(auto it = begin(map); it != end(map); ++it)
{

}

请注意,auto 不能被用作函数的返回类型,不过在函数有尾随返回值(trailing return type 2)的情况下,你可以用 auto 来代替函数的返回类型。此时, auto 告诉编译器不需要推断而只是直接在函数末尾查找返回类型。比如在下面的例子中,compose 函数的返回值就是操作符+ 的返回值,该操作符用于将类型 T1 和类型 T2 的值相加。

>>> 阅读全文

 

, ,

C++11 一览 (一)

C++0x 现在成为了一个正式的标准,将以下称为 C++11。在2011年,它被批准成为ISO C++。本文的目的是鸟瞰大部分的 C++11 功能,并对那些已经添加进 VS2010 的功能做出深刻的分析。本文可以作为一个平台让您对个别功能开始进行全面的研究。

背景
几乎花了一个世纪的时间,查尔斯 · 巴贝奇(Charles Babbage)的分析机(Difference Engine)才演变成强大的计算机。在四十年代,受限于当时计算机的运算速度和内存,只能使用汇编级别的语言。十年后,事情开始有所变化,从 1950 年到 1970 年期间绽放出许多编程语言,其中许多一些延续到今天。

1979 年,为贝尔实验室工作的 Bjarne Stroustrup 开始着手加强”C”语言,首先添加了类,然后是虚函数、 运算符重载,多重继承、 模板和异常处理,以及其它功能。起初他管这个语言叫“带类的C -C with Classes”。在1983年更名为 c++ (+ + 可能说它是 C 的递增) 。

C++ 大事件/演化时间表如下:

  • 1983 – 第一个商业版本的 C++ 编译器
  • 1998 – C++ 标准委员会开始标准化 C++ [C++98]
  • 2003 – 推出不带任何新功能的补丁包 [C++03]
  • 2005 – 发布了“库技术报告- Library Technical Report 简称 TR1”
  • 2011 – 引入大量的功能并增强 C++ 标准库

我们可以看出,这个变化是最大的一次(好吧,添加 STL 也可以算是大变化)。

>>> 阅读全文

 

, , ,