Расширение макросов с переменным числом аргументов MSVC ++

Итак, у меня есть макрос, который хорошо работает в 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 по какой-то причине ex объединяет все мои __VA_ARGS__ в один аргумент:

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

  Base * parent;
}

Кто-нибудь знает, почему это так? Есть ли какой-нибудь трюк, который я могу использовать, чтобы заставить Microsoft расширить это, как GCC? Может быть, добавить пару лишних пар круглых скобок?

Подобные макросы действительно могут помочь мне заменить кучу «связующего» кода, но из-за этой проблемы я не могу перенести его в свой проект VS. Любая помощь будет принята с благодарностью!

Спасибо.

22
задан a3f 30 March 2015 в 13:32
поделиться