MSVC ++ expansão de macro variadic

Então, eu tenho uma macro que funciona bem no GCC, mas não no C ++ Compiler da Microsoft. Espero que alguém conheça uma solução alternativa ou talvez possa me explicar por que ela se comporta dessa maneir

Tenho certeza de que essa macro não é exatamente "padrão", mas realmente me ajudari

Aqui está um exemplo funcional da macro:

#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)

Aqui está como eu poderia usar essa macro:

struct MyStructure
{
  void Foo()
  {
    EXPAND_THESE(Property1, Property2, Property3, Property4)
  }

  Base * parent;
}

Veja como o GCC expande o acima:

struct MyStructure
{
  void Foo()
  {
    parent->GetProperty<Property1>(); 
    parent->GetProperty<Property2>(); 
    parent->GetProperty<Property3>(); 
    parent->GetProperty<Property4>();
  }

  Base * parent;
}

Mas, por algum motivo, a Microsoft expande todos os meus __VA_ARGS__ como um argumento:

struct MyStructure
{
  void Foo()
  {
    parent->GetProperty<Property1, Property2, Property3, Property4>();
  }

  Base * parent;
}

Alguém sabe por que isso acontece? Existe algum truque que eu possa usar para que a Microsoft expanda isso como o GCC? Talvez jogar alguns pares extras de parênteses?

Macros como esse podem realmente me ajudar a substituir um monte de código "cola", mas por causa desse problema, não consigo movê-lo para o meu projeto VS. Qualquer ajuda seria muito apreciada

Obrigado

questionAnswers(4)

yourAnswerToTheQuestion