在运行时C++编写多个类的类
Composing class of several classes in C++ at runtime
对于我正在开发的解析器,我正在解析事件日志。在日志中,每一行都是一个事件,这使得逐行解析文件变得容易。记录的事件在开始时有一个字符串标识符,其构造如下:
X_Y_Z
X
总是相同的,并且可以解析为具有 8 个成员的类,因为它有 8 个参数。
Y
可以是 6 种不同的类型,所有这些类型都有不同数量的参数,可以根据它们Y
的类型进行不同的解释。为这 6 种类型中的每一种创建一个类是微不足道的;因为它们只是string
s、int
s 和bool
s。
Z
可以是 20 多种不同的东西,所有事物都有不同数量的参数,可以有不同的解释。为这 20+ 类型创建一个类也是微不足道的;因为它们只是string
s、int
s 和bool
s。
因此,事件类可以定义为:
template<typename Y, typename Z>
struct Event {
DateTime timestamp;
X base;
Y prefix;
Z suffix;
}
这将允许我们在编译时构造任何可能的事件组合。
问题是日志文件是在运行时解析的,我希望能够在运行时编写这些类,具体取决于我需要的类。此外,我想尽可能避免演员表。
需要注意的重要一点是,我需要在解析完成后迭代这些组合事件,作为第二遍。
实现这一目标的最优雅方法是什么?
编辑:我想到的一个解决方案是使用std::variant
,并将Y和Z存储为事件类中基于整数的ID。它可以工作,但我正在寻找可能比具有 20 个参数的std::variant
更优雅的东西。
如果基于多态的解决方案可行,则可以使用双重调度技术来执行此操作。
它遵循一个最小的工作示例来展示它是如何工作的:
struct X { int i; int j; };
struct Visitor;
struct YBase { virtual void accept(Visitor &) =0; };
struct Y1: YBase { void accept(Visitor &) override; int i; };
struct Y2: YBase { void accept(Visitor &) override; bool b; };
struct ZBase { virtual void accept(Visitor &) = 0; };
struct Z1: ZBase { void accept(Visitor &) override; double d; };
struct Z2: ZBase { void accept(Visitor &) override; char c; };
struct Visitor {
void visit(Y1 &y1) { y1.i = 0; }
void visit(Y2 &y2) { y2.b = true; }
void visit(Z1 &z1) { z1.d = .42; }
void visit(Z2 &z2) { z2.c = 'c'; }
};
void Y1::accept(Visitor &v) { v.visit(*this); }
void Y2::accept(Visitor &v) { v.visit(*this); }
void Z1::accept(Visitor &v) { v.visit(*this); }
void Z2::accept(Visitor &v) { v.visit(*this); }
struct Event {
X base;
YBase *prefix;
ZBase *suffix;
};
void visit(Event &e) {
Visitor v;
e.prefix->accept(v);
e.suffix->accept(v);
}
int main() {
Y2 y;
Z1 z;
Event e;
e.prefix = &y;
e.suffix = &z;
visit(e);
}
因为我不知道细节上真正的问题是什么,我尽力给你一个有意义的例子。我想您可以使用访问者类从已删除的Y*
/Z*
实例中提取感兴趣的参数。
无论如何,这可以用作开始设计基于双重调度的解决方案的点。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 建议在运行时将带有类实例的列表从c++导入qml
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 读取文件时运行时的未知行为
- 函数在Windows或Linux上运行时表现不同
- 在声明中合并两个常量"std::set"(不是在运行时)
- AWS Lambda C++运行时权限被拒绝
- 通过switch和static_cast访问多态对象的运行时类型
- 如何修复 Onnx运行时会话>运行问题?