如何将参数反转为可变参数宏?例如,我想
#define REVERSE(...) ???
REVERSE(A,B,C) // expands to C,B,A
我的目标是分离正面和背面的论点:
#define APPLY(FUN,...) FUN(__VA_ARGS__)
#define FRONT(FIRST,...) FIRST
#define REST(FIRST,...) __VA_ARGS__
#define MOST(...) APPLY(REVERSE,APPLY(REST,REVERSE(__VA_ARGS__)))
#define BACK(...) APPLY(FRONT,REVERSE_ARGUMENTS(__VA_ARGS__))
FRONT(A,B,C) // expands to A
REST(A,B,C) // expands to B,C
MOST(A,B,C) // expands to A,B
BACK(A,B,C) // expands to C
答案 0 :(得分:2)
这是一个不使用任何外部库的答案。
没有办法在宏中反转任意长度列表,因为编译器只进行一次代码传递,因此循环和递归实际上是不可能的。此代码适用于长度为10的列表。可以扩展更长的列表。
$(SourceBranchName)
REVERSE获取va args列表和args列表的长度并返回其反向。
要获取列表的长度,请使用此
#define EXPAND(x) x
#define REVERSE_1(a) a
#define REVERSE_2(a,b) b,a
#define REVERSE_3(a,...) EXPAND(REVERSE_2(__VA_ARGS__)),a
#define REVERSE_4(a,...) EXPAND(REVERSE_3(__VA_ARGS__)),a
#define REVERSE_5(a,...) EXPAND(REVERSE_4(__VA_ARGS__)),a
#define REVERSE_6(a,...) EXPAND(REVERSE_5(__VA_ARGS__)),a
#define REVERSE_7(a,...) EXPAND(REVERSE_6(__VA_ARGS__)),a
#define REVERSE_8(a,...) EXPAND(REVERSE_7(__VA_ARGS__)),a
#define REVERSE_9(a,...) EXPAND(REVERSE_8(__VA_ARGS__)),a
#define REVERSE_10(a,...) EXPAND(REVERSE_9(__VA_ARGS__)),a
#define REVERSE1(N,...) EXPAND(REVERSE_ ## N(__VA_ARGS__))
#define REVERSE(N, ...) REVERSE1(N, __VA_ARGS__)
我在msvc2015中使用它,需要使用EXPAND。如果你正在使用gcc / g ++,它应该没有EXPAND。
答案 1 :(得分:1)
Boost Preprocessor Library可以反转宏参数。不幸的是,它只能达到实现定义的最大参数列表长度。据我所知,不可能编写一个反转任意长的参数列表的宏。
#include <boost/preprocessor.hpp>
#define REVERSE(...) BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_REVERSE(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)))
#define APPLY(FUN,...) FUN(__VA_ARGS__)
#define FRONT(FIRST,...) FIRST
#define BACK(...) APPLY(FRONT,REVERSE(__VA_ARGS__))
#define REST(FIRST,...) __VA_ARGS__
#define MOST(...) APPLY(REVERSE,APPLY(REST,REVERSE(__VA_ARGS__)))