Boost.Hana-zh Version Travis status Appveyor status Try it online Gitter Chat

Boost.Hana 中文文档,翻译自 http://boostorg.github.io/hana/ 版本: Boost.Hana 1.2.0

元编程标准库中文文档

快速访问:https://coding.net/u/freezestudio/p/Boost.Hana-zh/git

概览

  1. #include <boost/hana.hpp>
  2. #include <cassert>
  3. #include <string>
  4. namespace hana = boost::hana;
  5. using namespace hana::literals;
  6. struct Fish { std::string name; };
  7. struct Cat { std::string name; };
  8. struct Dog { std::string name; };
  9. int main() {
  10. // 持有异构对象的序列和操纵它们的算法。
  11. auto animals = hana::make_tuple(Fish{"Nemo"}, Cat{"Garfield"}, Dog{"Snoopy"});
  12. auto names = hana::transform(animals, [](auto a) {
  13. return a.name;
  14. });
  15. assert(hana::reverse(names) == hana::make_tuple("Snoopy", "Garfield", "Nemo"));
  16. // `animals`承载的字符串不是常量表达式,即便如此,因为长度是`constexpr`的,故此不会丢失编译时信息。
  17. static_assert(hana::length(animals) == 3u, "");
  18. //类型的计算可以使用与普通C++相同的语法来执行。 不管相信与否,一切都在编译时完成。
  19. auto animal_types = hana::make_tuple(hana::type_c<Fish*>, hana::type_c<Cat&>, hana::type_c<Dog*>);
  20. auto animal_ptrs = hana::filter(animal_types, [](auto a) {
  21. return hana::traits::is_pointer(a);
  22. });
  23. static_assert(animal_ptrs == hana::make_tuple(hana::type_c<Fish*>, hana::type_c<Dog*>), "");
  24. // 还有更多可轻松获取的好处,包括:
  25. // 1. 访问元组的语法更清晰
  26. static_assert(animal_ptrs[0_c] == hana::type_c<Fish*>, "");
  27. static_assert(animal_ptrs[1_c] == hana::type_c<Dog*>, "");
  28. // 2. 很轻松地在编译时展开循环
  29. std::string s;
  30. hana::int_c<10>.times([&]{ s += "x"; });
  31. // 相当于 s += "x"; s += "x"; ... s += "x";
  32. // 3. 检查表达式的有效性也很方便
  33. // 原先为此通常需要基于复杂的SFINAE技巧才行
  34. auto has_name = hana::is_valid([](auto&& x) -> decltype((void)x.name) { });
  35. static_assert(has_name(animals[0_c]), "");
  36. static_assert(!has_name(1), "");
  37. }

文档

可以在线浏览 http://boostorg.github.io/hana。也可以从gh-pages分支检出一份离线文档。为避免覆盖当前目录,最好clonegh-pages分支到一个像doc/html这样的一个子目录中:

  1. git clone http://github.com/boostorg/hana --branch=gh-pages --depth=1 doc/html

发布后,doc/html将包含与可在线使用[]的完全相同的静态网站。 注意,doc/html会自动被Git忽略,所以更新文档不会搞乱你的索引。

独立使用Hana

很容易将Hana设置为只为你所用。首先,需要安装CMake。而后,切换(cd)到项目根目录并新建build子目录:

  1. mkdir build
  2. cd build
  3. cmake ..

通常,系统自带的编译器过于陈旧,你可能需要指定的编译器:

  1. cmake .. -DCMAKE_CXX_COMPILER=/path/to/compiler

一般来说,这样就能很好地工作了。但是,在一些系统上,标准库和/或编译器默认不支持C++14。这样的话查看wiki,那里有更多针对不同系统的设置信息。

通常,Hana会尝试在你的系统上查找Boost头文件,没有Boost头文件Hana仍然能够工作,只不过将会禁用少数几个依赖于Boost的测试。但是如果你想要Hana使用自定义安装的Boost,你需要指定自定义安装Boost的位置:

  1. cmake .. -DCMAKE_CXX_COMPILER=/path/to/compiler -DBOOST_ROOT=/path/to/boost

现在可以构建与运行单元测试及示例了:

  1. cmake --build . --target check

先说清楚,编译单元测试是相当耗时的,也需要大量的内存占用,特别是对外部适配器的测试。 这是由于Hana的单元测试是非常彻底的,而且其他库中的异构序列往往具有更巨量的编译消耗。

一些可选的目标仅在你的系统上安装有相应的软件才会启用。比如,生成文件需要系统安装了DoxygenCMake在生成期间会打印出哪些目标没有启用。你可以根据这些信息安装相应的软件后再重新CMake

提示

help 选项可列出需要的软件。

若想添加单元测试或者示例,将源文件添加到test/example/目录下重新CMake即可。假设相对路径从项目到新源文件的根目录是path/to/file.cpp。 重新运行CMake生成步骤后,将会创建一个名为path.to.file的新目标,并且还将创建相同名称的测试。像这样,

  1. cd build # Go back to the build directory
  2. cmake --build . --target path.to.file # Builds the program associated to path/to/file.cpp
  3. ctest -R path.to.file # Runs the program as a test

Sublime Text用户的提示

使用此hana.sublime-project支持文件,选择[Hana] Build current file 构建系统,当看到目标被关联到(like a test or an example), 按⌘B键编译, 或者按⇧⌘B键编译并运行。

项目结构

项目有几个子目录。

  • benchmark目录存放编译时和运行时的基准测试内容,以确保库的速度与所说的那快。 基准测试中的代码主要以eRuby模板的形式编写。 模板用于生成C++文件,以进行编译编译和执行统计。
  • cmake目录存放用于编译系统所用的CMake模块及其它脚本。
  • doc目录存放生成文件所需的配置文件。Git会自动忽略doc/html子目录;如上所述,您可以方便地将gh-pages分支克隆到该目录以存储本地文档副本。
  • example目录存放所有教程与参考示例的源代码。
  • experimental目录存放的实验性功能有可能在适当的时候加入到库中。
  • include目录存放库的源代码,它们只有头文件。
  • test目录存放单元测试源代码。

相关资料

贡献

参见CONTRIBUTING.md.

许可

参见LICENSE.md.

发布

本节所述仅与Hana开发者有关,记录创建新版本的几个简单步骤。为发布一个新版本,使用git tag -a创建新标签,在include/boost/hana/version.hpp中改变相应的版本号。