c++ - 使用 boost 元解析字符串解析包含的文件
问题描述
我想在编译时使用 boost Metaparse 来解析 DSL。但是对于分离问题,我不想将我的 DSL 作为一个大字符写入 C++ 文件,而是使用预处理器(可能通过#include
)在编译时从单独的文件中获取文本。
boost 元解析文档提到了预处理器宏BOOST_METAPARSE_STRING
,因此BOOST_METAPARSE_STRING("DSL content")
在预处理器时转换为metaparse::string<'D','S','L',' ', 'c','o'...>
所以而不是
using input = BOOST_METAPARSE_STRING("DSL content");
我想使用类似的东西
using input = BOOST_METAPARSE_STRING(#include "dsl.txt");
dsl.txt 包含
DSL content
但是这种天真的方法行不通,有什么想法吗?
解决方案
如果您不反对在包含的文件中添加一些文本,则可以dsl.txt
如下所示:
BOOST_METAPARSE_STRING(r"//(
DSL content
)//");
接着:
using input =
#include "dsl.txt"
(假设您使用的是包含原始字符串的 C++ 版本。否则,它会更烦人。)
如果您愿意,可以使用简单的 shell 命令添加第一行和最后一行。
这并不理想,但由于BOOST_METAPARSE_STRING
似乎需要字符串文字,我认为没有更好的选择。
另一方面,如果您发现使用外部预处理器是可以接受的,那么编写一个metaparse::string
从文本文件创建模板调用的预处理器一点也不难。您不必将自己限制在 C++ 预处理器中。任何构建工具都允许您使用自定义构建步骤;甚至首先编译您的预处理器以预处理文本文件。
推荐阅读
- next.js - 没有服务器端渲染功能的导入模块
- azure - 在故障恢复时刷新 Redis 密钥
- python - 使用 python 对数学运算进行基准测试
- android - 如何从响应正文中获取数据?
- python-3.x - 任务是将字符串转换为浮点数,但我的文件仍然是字符串。为什么?
- flutter - 如何将名为“LIstEntries”的类型转换为可迭代
- azure - 无法使用具有自定义 DNS 服务器的专用网络从 Azure 容器实例访问网站
- internet-explorer-11 - 为什么我不能在 IE11 中将全局变量设置为子窗口?
- php - 构建 Laravel 控制器
- linux - nmap 命令列出网络中的 Mac OS x 机器