1
私は、すべての引数(たとえば、最大6)に対して特定の関数を呼び出す可変長マクロを作成したいと考えています。これまでのところ私はMSVCで次のコードを使用してきた:移植性のある可変長マクロ
#define do_write2(x,y) do{do_write(x);do_write(y);}while(0)
#define do_write3(x,y,z) do{do_write(x);do_write(y);do_write(z);}while(0)
#define do_write4(x,y,z,w) do{do_write(x);do_write(y);do_write(z);do_write(w);}while(0)
#define do_write5(x,y,z,w,t) do{do_write(x);do_write(y);do_write(z);do_write(w);do_write(t);}while(0)
#define do_write6(x,y,z,w,t,u) do{do_write(x);do_write(y);do_write(z);do_write(w);do_write(t);do_write(u);}while(0)
#define expand(x) x
#define _get_write(_1,_2,_3,_4,_5,_6,name,...) name
#define dumpval(...) expand(_get_write(__VA_ARGS__,do_write6,do_write5,do_write4,do_write3,do_write2,do_write))expand((__VA_ARGS__))
expand
が原因MSVCで__VA_ARGS__
の独特の取り扱いに必要とされ、そうでない場合、私は今、私がする必要がある、しかし
error C2660: 'do_write' : function does not take 6 arguments
を取得しますGCCで同じコードを構築し、そのはそれに問題がある:
error: ‘do_write3’ was not declared in this scope
は単にexpand
ラッパーを削除すると、トリックを行います。しかし、#ifdef
を使用せずにどちらの場合でもコードをコンパイルするための「正しい」方法はありますか?
これはマクロを使用して*行う必要がありますか? 'C++ 11'を使えますか? –
私はそれを代わりにバリデーショナルテンプレートを使用するよう書き直すことができたと思います。コードはかなり古く、私はこの可能性を考慮しませんでした。 – riv