1. ホーム
  2. c++

[解決済み] C++マクロのオプションパラメータ

2022-08-10 11:21:14

質問

C++のマクロでオプションのパラメータを取得する方法はありますか?オーバーロードのようなものもあればいいのですが。

どのように解決するのですか?

ここに一つの方法があります。これは引数のリストを 2 回使用し、最初にヘルパー マクロの名前を形成し、次にそのヘルパー マクロに引数を渡します。これは、マクロへの引数の数をカウントするための標準的なトリックを使用します。

enum
{
    plain = 0,
    bold = 1,
    italic = 2
};

void PrintString(const char* message, int size, int style)
{
}

#define PRINT_STRING_1_ARGS(message)              PrintString(message, 0, 0)
#define PRINT_STRING_2_ARGS(message, size)        PrintString(message, size, 0)
#define PRINT_STRING_3_ARGS(message, size, style) PrintString(message, size, style)

#define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
#define PRINT_STRING_MACRO_CHOOSER(...) \
    GET_4TH_ARG(__VA_ARGS__, PRINT_STRING_3_ARGS, \
                PRINT_STRING_2_ARGS, PRINT_STRING_1_ARGS, )

#define PRINT_STRING(...) PRINT_STRING_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)

int main(int argc, char * const argv[])
{
    PRINT_STRING("Hello, World!");
    PRINT_STRING("Hello, World!", 18);
    PRINT_STRING("Hello, World!", 18, bold);

    return 0;
}

これはマクロの呼び出し側にとっては簡単ですが、書き手にとってはそうではありません。