Skip to content

Macro meta programming

Raymond Chen edited this page May 14, 2019 · 3 revisions

WIL provides some macros to assist with macro meta-programming.

WI_FLATTEN

The WI_FLATTEN macro takes a variable number of arguments and removes the parentheses.

#define WI_FLATTEN(...) __VA_ARGS__

WI_PASTE

The WI_PASTE macro takes two arguments. It expands the two arguments, then pastes the results.

Example:

#define apple_pie 3.14
#define flavor apple
double pie = WI_PASTE(flavor, _pie); // expands to 3.14

WI_ARGS_COUNT

The WI_ARGS_COUNT macro takes up to 99 arguments and expands to the number of arguments it was passed.

Example:

int value = WI_ARGS_COUNT(x, y, z); // expands to 3

WI_FOREACH

The WI_FOREACH macro applies its first parameter to up to 99 remaining parameters.

Example:

#define CHECK(value) CheckValue(value);
#define CHECK_EACH(...) WI_FOREACH(CHECK, __VA_ARGS__)

CHECK_EACH(1, 2, 3)
// expands to
CheckValue(1); CheckValue(2); CheckValue(3);

WI_MACRO_DISPATCH

The WI_MACRO_DISPATCH expands a macro whose name is computed by suffixing its first parameter with the number of additional parameters (up to 99). The computed macro is then expanded with the additional parameters as its parameters.

Example:

#define CHECK0() Empty()
#define CHECK1(x) Alpha(x)
#define CHECK2(x, y) Beta(x, y)
#define CHECK3(x, y, z) Gamma(x,y,z)

WI_MACRO_DISPATCH(CHECK, 12, 34) // expands to CHECK2(12, 34)
// which expands to Beta(12, 34)