【发布时间】:2012-05-25 05:17:38
【问题描述】:
所以我有这棵巨大的树,它基本上是一个带有字符串键和不同函数调用的大开关/案例,具体取决于键和一条元数据。
每个条目基本上都是这样的
} else if ( strcmp(key, "key_string") == 0) {
((class_name*)object)->do_something();
} else if ( ...
do_something 可以有不同的调用,所以我不能只使用函数指针。此外,某些键需要将对象强制转换为子类。
现在,如果我要用高级语言编写代码,我会使用 lambda 字典来简化它。
我突然想到我可以使用宏将其简化为类似
case_call("key_string", class_name, do_something());
case_call( /* ... */ )
case_call 是一个宏,可以将此代码扩展为第一个代码 sn-p。
但是,我对这是否被认为是好的风格持怀疑态度。我的意思是,它会减少打字工作并提高代码的干性,但它确实似乎在某种程度上滥用了宏系统。
你会走那条路,还是把整件事都打出来?您这样做的理由是什么?
编辑
一些澄清:
此代码用作简化脚本 API 之间的粘合层,该 API 将 C++ API 的几个不同方面作为简单的键值属性访问。这些属性在 C++ 中以不同的方式实现:有些具有 getter/setter 方法,有些设置在特殊的结构中。脚本操作引用转换为公共基类的 C++ 对象。但是,某些操作仅在某些子类上可用,并且必须进行强制转换。
以后,我可能会更改实际的 C++ API,但就目前而言,它必须被视为不可更改。此外,这必须在嵌入式编译器上工作,因此(遗憾的是)boost 或 C++11 不可用。
【问题讨论】:
-
为什么要关闭投票 - 这是一个非常好的、有效的问题。我在这里错过了什么?
-
这是一个很好的问题,但是“这个问题不适合我们的问答形式。我们希望答案通常涉及事实、参考资料或特定专业知识;这个问题可能会征求意见、辩论、争论、投票或扩展讨论。"
-
在 C++ 11 中,您可以使用 lambda 字典来简化此操作。
-
我不会回避宏,我认为 boost 可能在预处理器库中有你需要的东西,但我还没有使用过
-
你能举一个更具体的例子来说明你现在拥有什么吗?
标签: c++ c coding-style macros metaprogramming