【发布时间】:2018-01-06 05:31:39
【问题描述】:
对于我正在开发的解析器,我正在解析事件日志。在日志中,每一行都是一个事件,这样可以很容易地逐行解析文件。记录的事件在开始时有一个字符串标识符,其构造如下:
X_Y_Z
X 总是相同的,可以被解析为一个有 8 个成员的类,因为它有 8 个参数。
Y 可以是 6 种不同的类型,它们都有不同数量的参数,可以根据 Y 的类型进行不同的解释。为这 6 种类型中的每一种创建一个类是微不足道的;因为它们只是strings、ints 和bools。
Z 可以是超过 20 种不同的东西,它们都有不同数量的参数,可以用不同的方式解释。为这 20 多种类型创建一个类也很简单;因为它们只是strings、ints 和bools。
因此,事件类可以这样定义:
template<typename Y, typename Z>
struct Event {
DateTime timestamp;
X base;
Y prefix;
Z suffix;
}
这将允许我们在编译时构造任何可能的事件组合。
问题是日志文件是在运行时解析的,我希望能够在运行时编写这些类,具体取决于我的需要。此外,我想尽可能避免强制转换。
需要注意的是,我需要在解析完成后迭代这些组合事件,作为第二遍。
实现这一目标最优雅的方法是什么?
编辑:我想到的一种解决方案是使用std::variant,并将 Y 和 Z 作为基于整数的 ID 存储在事件类中。它可以工作,但我正在寻找可能比具有 20 个参数的 std::variant 更优雅的东西。
【问题讨论】:
-
您可以在主函数中为类动态分配内存
-
如果您的事件是
Y1,Z1类型而不是Y6,Z20类型,则取决于您需要做的不同。如果答案是 - 没什么,您可能只存储一组字段。那么,是否您需要为 120 种组合中的每一种组合使用不同的逻辑? -
并非所有 120 种组合,假设有大约 50 条不同的路径可供选择。
-
与使用继承(动态多态性)相比,是否有特殊需要使其成为模板(静态多态性)?
-
不,动态多态也是可以接受的。
标签: c++ class templates inheritance