您正在寻找一个宏示例过载机制.
Boost.PP’s facilities.
#define MACRO_2(a, b) std::cout << a << ' ' << b;
#define MACRO_1(a) MACRO_2(a, "test") // Supply default argument
// Magic happens here:
#define MACRO(...) BOOST_PP_OVERLOAD(MACRO_, __VA_ARGS__)(__VA_ARGS__)
Demo.参数数量与宏名称连接,可以轻松实现,无需Boost,如下所示:
#define VARGS_(_10, _9, _8, _7, _6, _5, _4, _3, _2, _1, N, ...) N
#define VARGS(...) VARGS_(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define CONCAT_(a, b) a##b
#define CONCAT(a, b) CONCAT_(a, b)
和
#define MACRO_2(a, b) std::cout << a << ' ' << b;
#define MACRO_1(a) MACRO_2(a, "test") // Supply default argument
#define MACRO(...) CONCAT(MACRO_, VARGS(__VA_ARGS__))(__VA_ARGS__)