potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

WIL GitHub Wiki マクロによるメタプログラミングの和訳・改変

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