1. ホーム
  2. c

[解決済み】引数の個数でマクロをオーバーロードする方法

2022-04-08 15:59:39

質問

私は2つのマクロを持っています FOO2FOO3 :

#define FOO2(x,y) ...
#define FOO3(x,y,z) ...

新しいマクロを定義したい FOO を次のようにします。

#define FOO(x,y) FOO2(x,y)
#define FOO(x,y,z) FOO3(x,y,z)

しかし、マクロは引数の数でオーバーロードしないので、これはうまくいきません。

を変更することなく FOO2FOO3 というマクロを定義する方法はありますか? FOO (を使用)。 __VA_ARGS__ をディスパッチするのと同じ効果を得ることができます。 FOO(x,y)FOO2 となります。 FOO(x,y,z) から FOO3 ?

解決方法は?

簡単なことです。

#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__)

つまり、これらのマクロがあれば、記述したとおりに展開されるわけです。

FOO(World, !)         // expands to FOO2(World, !)
FOO(foo,bar,baz)      // expands to FOO3(foo,bar,baz)

4枚目が欲しい場合

#define GET_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO4, FOO3, FOO2)(__VA_ARGS__)

FOO(a,b,c,d)          // expands to FOO4(a,b,c,d)

当然ながら FOO2 , FOO3FOO4 の場合、出力は定義されたマクロのものに置き換わります。