MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiからマクロによるメタプログラミングの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。
マクロによるメタプログラミング
Raymond Chen、2019/5/15、リビジョン3回
WILはマクロによるメタプログラミングを補助するいくつかのマクロを提供します。
WI_FLATTEN
WI_FLATTEN
マクロは任意個の引数を受け取り、カッコを除去します。
#define WI_FLATTEN(...) __VA_ARGS__
WI_PASTE
WI_PASTE
マクロは2個の引数を受け取ります。それらの展開結果が貼り付けられます。
例:
#define apple_pie 3.14 #define flavor apple double pie = WI_PASTE(flavor, _pie); // 3.14に展開されます。
WI_ARGS_COUNT
WI_ARGS_COUT
マクロは99個までの引数を受け取り、渡された引数の数に展開されます。
例:
int value = WI_ARGS_COUNT(x, y, z); // 3に展開されます。
WI_FOREACH
WI_FOREACH
マクロは最初の引数に続く99個までの引数を適用します。
例:
#define CHECK(value) CheckValue(value); #define CHECK_EACH(...) WI_FOREACH(CHECK, __VA_ARGS__) CHECK_EACH(1, 2, 3) // 以下に展開されます。 CheckValue(1); CheckValue(2); CheckValue(3);
WI_MACRO_DISPATCH
WI_MACRO_DISPATCH
は最初の引数に続く引数の個数(最大99個)を付けた名前でマクロを算出します。算出されたマクロは2番目以降の引数を与えられたマクロとして展開されます。
例:
#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) // CHECK2(12, 34)に展開されます。 // それからBeta(12, 34)に展開されます。
著作権表示
この記事は以下の著作物を使用しています。
Copyright (c) Microsoft Corporation. All rights reserved. https://github.com/microsoft/wil/blob/master/LICENSE