3

可変個引数マクロへの引数を逆にするにはどうすればよいですか?たとえば、

#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
4

2 に答える 2

2

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__)))
于 2013-01-24T15:13:00.327 に答える