如何在变量参数长度C++宏(...和va_args)?
我正在尝试编写一个 C++ 宏,它将取代经常需要的冗长代码,例如
switch (id) {
case 0:
s << myFloat;
break;
case 1:
s << myInt;
break;
default: break;
}
使用 DESERIALIZE_MEMBERS(myFloat, myInt)
之类的代码。 s
和 id
不会更改用例的名称,因此它们不需要是宏参数。
它应该支持可变参数长度,因此对于另一种情况,DESERIALIZE_MEMBERS(myString, myArrayOfInts, myLong)
也应该可以工作,向 switch 表达式添加第三个 case
语句。
但是,我不清楚如何在宏内为每个参数迭代 case N:
中的 N
值。
在标准 C++ 宏中这可能吗?
I am trying to write a C++ macro which would substitue a frequently-needed verbose code like
switch (id) {
case 0:
s << myFloat;
break;
case 1:
s << myInt;
break;
default: break;
}
with something like DESERIALIZE_MEMBERS(myFloat, myInt)
. s
and id
will not change names for the use case, so they don't need to be macro parameters.
It should support variable argument length, so DESERIALIZE_MEMBERS(myString, myArrayOfInts, myLong)
for another case should also work, adding a third case
statement to the switch expression.
However, it's not clear to me how to iterate the N
value in case N:
inside the macro for each argument.
Is that possible at all in standard C++ macros?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在 c++17,这是一个解决方案。
首先是编译时常量类型和值:
接下来是此类常量的变体:
这使您可以在运行时生成编译时枚举值并使用它。
现在有一些代码可以让您将运行时整数转换为编译时枚举值:
因此,如果您执行
get_enum_v<10>(2)
,它会返回一个enum_t<...>
有 10 个替代项,其中包含索引 2 的替代项,该替代项是constant_v
。现在我们只得到一个元组和一个索引,然后我们在索引描述的元组元素上调用一个函数:
您现在可以这样做:
而不是
实例;可以在早于 的版本中重写代码c++17 但很快就会变得非常丑陋。
In c++17, here is a solution.
First a compile-time constant type and value:
Next, a variant over such constants:
this lets you generate a compile-time enumeration value at runtime and use it.
Now some code that lets you convert a runtime integer into a compile-time enumeration value:
so if you do
get_enum_v<10>(2)
, it returns anenum_t<...>
with 10 alternatives containing the alternative with index 2, which is aconstant_v<std::size_t, 2>
.Now we just get a tuple and an index, and we call a function on the tuple element described by the index:
you can now do this:
instead of
Live example; Code can be rewritten in versions older than c++17 but gets extremely ugly very fast.