Boost C++ Libraries

PrevUpHomeNext

示例:一对一生成器

假设您正在编写一个生成 C++ 代码的应用程序。如果您曾经做过这样的事情,您就会知道这并不美好。在字符串字面量中嵌入大量 C++ 代码非常笨拙。一个更好的解决方案是

  1. 编写要生成的代码的模板,在将要更改的位置留下占位符
  2. 在您的应用程序中访问模板,并将占位符替换为适当的文本。
  3. 编写结果。

实现起来非常容易。您编写特殊的逐字文件,这些文件只是 C++,除了文件的第一行包含应生成的变量的名称。创建一个简单的工具,该工具接受一个逐字文件并创建一个 cpp 文件,其中包含一个 char* 变量,其名称取自逐字文件的第一行,其值为文件的正确引用的内容。

让我们看看 Boost.Build 能做什么。

首先,Boost.Build 对“逐字文件”一无所知。因此,您必须注册一个新的目标类型。以下代码执行此操作

import type ;
type.register VERBATIM : verbatim ;

传递给 type.register 的第一个参数是声明类型的名称。按照惯例,它是大写的。第二个参数是此类型文件的后缀。因此,如果 Boost.Build 在源列表中看到 code.verbatim,它就知道它是 VERBATIM 类型。

接下来,您告诉 Boost.Build 逐字文件可以在一个构建步骤中转换为 C++ 文件。一个 生成器是构建步骤的模板,该步骤将一种类型(或一组类型)的目标转换为另一种类型。我们的生成器将被称为 verbatim.inline-file;它将 VERBATIM 文件转换为 CPP 文件

import generators ;
generators.register-standard verbatim.inline-file : VERBATIM : CPP ;

最后,您必须通知 Boost.Build 用于进行转换的 shell 命令。这是通过 actions 声明完成的。

actions inline-file
{
    "./inline-file.py" $(<) $(>)
}

现在,我们准备将所有内容整合在一起。将以上所有代码放在文件 verbatim.jam 中,将 import verbatim ; 添加到 Jamroot.jam 中,并且可以在您的 Jamfile 中编写以下内容

exe codegen : codegen.cpp class_template.verbatim usage.verbatim ;

列出的逐字文件将自动转换为 C++ 源文件,编译然后链接到 codegen 可执行文件。

在后续部分中,我们将扩展此示例,并详细回顾所有机制。完整代码可在 example/customization 目录中找到。


PrevUpHomeNext