将精神X3解析器封装在课堂上
Encapsulate Spirit X3 parser in class
我试图将X3解析器封装在类中,其中规则(及其定义)是成员,即与Qi解析器的结构相似,其中必须从Boost::Spirit :: Qi ::语法。
这种方法的优点是什么:
- 代码分离比示例中使用的名称空间方法更好(例如,避免命名空间冲突)
- 仅当生成此类的对象而不是解析器(单个规则)为静态时,解析器才实例化
- 潜在参数(例如问题解析器规则取决于参数)可以给出构造函数并以"直接"方式集成,而不是使用<>指令 使用
但这似乎是不可能的。auto name = rule<class name, std::string>() = alpha >> *alnum;
表格中定义规则(或规则定义)不是一个选项,因为类成员无法使用auto
。另一方面,除了很小的解析器外,实际类型似乎也不实用。建模替代方案是将规则作为成员并在构造函数中创建定义,但是在这里,通常使用boostrongpirit_define进行的链接是不可能的,并且仅规则不足以解析(static_assert失败"这个规则。")。
另外,将整个解析器都以类方法的形式使用,例如创建解析器的 ParseXYZ::parse()
可能是通过另一种方法使其仅创建一次 - 并且解析输入,在代码重复使用时并不是一个选择(除了复制&amp; paste)。
您知道是否可以将X3解析器封装在班级中?除此之外,您还建议在x3中构建可重复使用的解析器?
是的,是可能的,而不是auto name = rule<class name, std::string>() = alpha >> *alnum;
在定义中执行decltype(rule<class name, std::string>() = alpha >> *alnum) name;
,而在构造函数中进行name{rule<class name, std::string>() = alpha >> *alnum}
。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将可变参数函数的参数封装在类实例中
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 封装C++模板
- 将 RTOS 队列对象封装在仅具有静态分配的 IQueue 自定义接口中
- 从封装在对象中的函数 C++ 返回时为空的列表
- 当要访问的对象被多次封装时,如何正确使用setter
- 在为嵌套类定义行外友元时,我真的必须打破封装吗?
- 如何在类中封装C/C++套接字发送和接收函数?
- 如何使用吸气剂方法实现C++封装
- 封装 std::map 以允许迭代,但没有直接密钥访问?
- 类C++友元函数无法访问封装的类
- 当从成员类调用封装的std::begin时,程序崩溃
- 如何在课堂上重用和重新初始化 c++ discrete_distribution?
- 在课堂上创建了一个朋友,给出"无输入文件"错误
- 从私有成员类中断封装派生的模板类
- C++实用程序,用于将长开关语句转换为封装开关案例阶梯的简洁函数调用
- 如何修复列表视图中的错误?,封装控件时无法选择任何项
- C++来自课堂的内存数据?
- 我们可以使用命名空间实现封装吗?