そのため、GCCではうまく機能するマクロがありますが、MicrosoftのC++コンパイラでは機能しません。誰かが回避策を知っているか、おそらくそれがこのように動作する理由を私に説明できることを願っています。
このマクロは正確に「標準」ではないと確信していますが、それは本当に役に立ちます。
マクロの機能例を次に示します。
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)
#define FULLY_EXPANDED(count, ...) \
MAC ## count (__VA_ARGS__)
#define SEMI_EXPANDED(count, ...) FULLY_EXPANDED(count, __VA_ARGS__)
#define EXPAND_THESE(...) SEMI_EXPANDED(VA_NARGS(__VA_ARGS__), __VA_ARGS__)
#define ACTUAL_MACRO(x) parent->GetProperty<x>();
#define MAC1(a) ACTUAL_MACRO(a)
#define MAC2(a,b) MAC1(a) ACTUAL_MACRO(b)
#define MAC3(a,b,c) MAC2(a,b) ACTUAL_MACRO(c)
#define MAC4(a,b,c,d) MAC3(a,b,c) ACTUAL_MACRO(d)
#define MAC5(a,b,c,d,e) MAC4(a,b,c,d) ACTUAL_MACRO(e)
このマクロの使用方法は次のとおりです。
struct MyStructure
{
void Foo()
{
EXPAND_THESE(Property1, Property2, Property3, Property4)
}
Base * parent;
}
GCCが上記を拡張する方法は次のとおりです。
struct MyStructure
{
void Foo()
{
parent->GetProperty<Property1>();
parent->GetProperty<Property2>();
parent->GetProperty<Property3>();
parent->GetProperty<Property4>();
}
Base * parent;
}
しかし、Microsoftは何らかの理由で、私のすべての__VA_ARGS__を1つの引数として拡張しています。
struct MyStructure
{
void Foo()
{
parent->GetProperty<Property1, Property2, Property3, Property4>();
}
Base * parent;
}
なぜこれなのか誰か知っていますか?MicrosoftにGCCのようにこれを拡張させるために私が引っ張ることができるいくつかのトリックはありますか?たぶん、括弧のいくつかの余分なペアを投げますか?
このようなマクロは、大量の「グルー」コードを置き換えるのに非常に役立ちますが、この問題のため、VSプロジェクトに移動できません。どんな助けでも大歓迎です!
ありがとう。