【发布时间】:2018-12-19 08:27:36
【问题描述】:
这是我在 OpenCV 中看到的两行代码
#define CV_VA_NUM_ARGS_HELPER(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
#define CV_VA_NUM_ARGS(...) CV_VA_NUM_ARGS_HELPER(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
我猜是计算传递给CV_VA_NUM_ARGS 的可变参数的数量。以如下代码为例:
CV_VA_NUM_ARGS(a,b,c)
将扩展到
CV_VA_NUM_ARGS_HELPER(a,b,c,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
在这一点上,我一直在理解发生了什么。具体来说,我不知道_1、_2等的用处。有人可以帮帮我吗?这是一个类似的post,但对我来说更复杂。
编辑:
当我不传递任何参数时(比如CV_VA_NUM_ARGS_HELPER()),宏将被替换为 1 而不是 0,这是为什么呢?
【问题讨论】:
-
顺便说一句,如果你想计算超过 10 个可变参数的数量,
#define CV_VA_NUM_ARGS(...) std::tuple_size<decltype(std::make_tuple(__VA_ARGS__))>::value在 C++11 中有效。 -
@Hiroki:一般情况下,会根据参数数量在其他 MACRO 上进行调度,所以这种方式“失败”
-
@Jarod42 thx 但我仍然不太了解您的评论。假设such use cases,我评论了上面的行。那么你的“失败”是什么意思?因为通过我这 2 个月的 SO 生活,我知道您是一名出色的 C++ 程序员,所以我想通过示例准确理解您所说的内容并向您学习:)。
-
@Hiroki:我的意思是像example一样遍历可变参数宏,
-
@Jarod42 啊,我明白了。非常感谢!