gpt4 book ai didi

c++ - 使用预处理器对 C/C++ 进行元编程

转载 作者:IT老高 更新时间:2023-10-28 23:00:27 27 4
gpt4 key购买 nike

所以我有这棵巨大的树,它基本上是一个带有字符串键和不同函数调用的大开关/案例,具体取决于键和一条元数据。

每个条目基本上都是这样的

} else if ( strcmp(key, "key_string") == 0) {
((class_name*)object)->do_something();
} else if ( ...

where do_something 可以有不同的调用,所以我不能只使用函数指针。此外,某些键需要将对象强制转换为子类。

现在,如果我要用高级语言编写代码,我会使用 lambda 字典来简化它。

我突然想到我可以使用宏将其简化为类似

case_call("key_string", class_name, do_something());
case_call( /* ... */ )

其中 case_call 是一个宏,可以将此代码扩展为第一个代码片段。

但是,我对这是否被认为是好的风格持怀疑态度。我的意思是,它会减少打字工作并提高代码的干性,但它确实似乎在某种程度上滥用了宏系统。

你会走那条路,还是把整件事都打出来?您这样做的理由是什么?

编辑

一些澄清:

此代码用作简化脚本 API 之间的粘合层,该 API 将 C++ API 的几个不同方面作为简单的键值属性访问。这些属性在 C++ 中以不同的方式实现:有些具有 getter/setter 方法,有些设置在特殊的结构中。脚本操作引用转换为公共(public)基类的 C++ 对象。但是,某些操作仅在某些子类上可用,并且必须进行强制转换。

以后,我可能会更改实际的 C++ API,但就目前而言,它必须被视为不可更改。此外,这必须在嵌入式编译器上工作,因此(遗憾的是)boost 或 C++11 不可用。

最佳答案

我建议你稍微调换一下角色。你是说对象已经是某个知道如何处理某种情况的类,所以在你的基类中添加一个 virtual void handle(const char * key) 并让对象检查实现如果它适用于它并做任何必要的事情。

这不仅会消除冗长的 if-else-if 链,而且还会更安全,并让您在处理这些事件时更加灵活。

关于c++ - 使用预处理器对 C/C++ 进行元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10638951/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com