关于本书

本书第一版大约出版于 15 年前。起初我们的目的是编写一本对 C++ 工程师有帮助的 C++ 模板权威指南。目前该项目从以下几个方面来看是成功的:它的作用得到了不少读者的认可,也多次被推荐为参考书目,并屡获好评。

第一版已经很老了,虽然其中不少内容对现代 C++ 工程师依然很有帮助,但是鉴于 C++ 近年来的不断发展,比如现代 C++ 中从 C++11 到 C++14, 再到 C++17 标准的制定,对第一版中部分内容的修订势在必行。

对于第二版,我们的宗旨依然没有变:提供 C++ 模板的权威指南,它既应该是一本内容全面的参考书,也应是一本容易理解的教程。只是这一次我们针对的是现代 C++,它要远远复杂于本书第一版出版时的那个 C++。

目前的 C++ 编程环境要好于本书第一版发布之时。比如这期间出现了一些深入探讨模板应用的书籍。更重要的是,我们可以从互联网上获取更多的 C++ 模板知识,以及基于模板的编程技术和应用实例。因此在这一版中,我们将重点关注那些可以被广泛应用的技术。

第一版中的部分内容目前来看已经过时了,因为现代 C++ 提供了可以完成相同功能,但又颇为简单的方法。因此这一部分内容会被从第二版中删除,不过不用担心,现代 C++ 中对应的更为先进的内容会被加入进来。

尽管 C++ 模板的概念已经出现了 20 多年了,目前 C++ 开发者社区中依然会不断发现其在软件开发中新的应用场景。本书的目标之一是和读者分享这些内容,当然也希望能够启发读者产生新的理解和发现。

如何阅读本书

如果你是一个想去学习或者复习模板概念的 C++ 程序员,请仔细阅读第一部分。即使你已经非常熟悉模板,也请快速浏览下这一部分,这能够让你熟悉我们的写作风格以及我们常用的术语。该部分也涵盖了如何组织模板相关代码的内容。

根据你自己的学习方法,可以自行决定是先仔细学习第二部分的模板知识,还是直接阅读第三部分的实际编程技巧(必要时可以回头参考第二部分中的内容)。如果你购买本书的目的就是为了解开你心中的某些困惑的话,后一种方法可能更为实用。

正文所引用的附录中也包含有很多有用的信息。我们会在保证正确的情况下将它们展现地尽可能有趣一些。

根据我们的经验,从示例代码开始学习是一个很好的方法。因此在本书中你会看到很多的示例代码。其中一些只是为了展示某一抽象概念,因此可能只有几行,而另一些可能就是介绍了某种具体应用场景的完整程序了。对于后一种情况,代码所在文件会在相应的 C++ 注释中注明,你可以在如下链接中找到它们:http://www.tmplbook.com。

C++11,14 和 17 标准

第一版 C++ 标准发布于 1998 年,随后于 2003 年做了一次技术修订。因此“旧的 C++ 标准”指的就是 C++98 或者 C++03。C++11 是在 ISO C++ 标准委员会主导下的第一版主要修订,它引入了非常多的新特性。本书会讨论其中和模板有关的一部分新特性,包含:

  • 变参模板(Variadic templates)
  • 模板别名(Alias templates)
  • 移动语义,右值引用和完美转发(Move semantics, rvalue references and perfectforwarding)
  • 标准类型萃取(Standard type traits)

C++14 和 C++17 紧随其后,也引入了一些新的语言特性,虽然不像 C++11 那么多。本书涉及到的和模板有关的新特性包含但不限于:

  • 变量模板(Variable templates, C++14)
  • 泛型 lambdas(Generic Lambdas, C++14)
  • 类模板形参推导(Class template argument deduction, C++17)
  • 编译期 if (Compile-time if, C++17)
  • 折叠表达式(Fold expression, C++17)

我们甚至介绍了“Concept(模板接口)”这一确定将在 C++20 中包含的概念。在编写本书的时候,C++11 和 C++14 已经被大多数主流编译器支持,C++17 的大部分特性也已被支持。不同编译器对新标准不同特性的实现仍然会有很大地不同。其中一些编译器可以编译本书中的大部分代码,少数编译器可能无法编译本书中的部分代码。不过我们认为这一问题会很快得到解决,主要是因为几乎所有的于程序员都会要求他们的供应商尽快去支持新标准。

虽然如此,C++ 这门语言依然会随时时间继续发展。C++ 委员会的专家们(不管他们是否会加入 C++ 标准委员会)也一直都在讨论着很多可以进一步优化这一语言的方法,而且目前已经有一些备选方案会影响到模板,第 17 章将会介绍这一方面的发展趋势。


http://example.com/2023/08/15/cpp-template-ch/cpp-template-ch00/
作者
QiDianMaker
发布于
2023年8月14日
许可协议