2013-01-16 79 views
2

如何顛倒可變參數宏的參數?例如,我想將可變參數的參數顛倒

#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 

回答

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__)))