Как я могу иметь эффект параметра по умолчанию с помощью шаблона variadic - PullRequest
0 голосов
/ 27 июля 2011

Я уже некоторое время решаю эту проблему и не могу понять, как ее решить. Контекст является системой отражения в C ++. Объяснение проблемы заключается в следующем. У меня есть эти 2 структуры. Одним из них является представление нескольких родителей типа ClassType, а другим - класс Orphan (класс типа ClassType и без родителей)

template<typename ClassType, typename... ParentTypeList>
struct Parents 
{
};

template<typename ClassType>
struct Parents<ClassType>
{        
};

Затем в объявлении моих классов, которые будут отражены, я использую этот макрос, класс ReflectionHelper :: Parents - классы выше

#define DEFINE_METACLASS(className, ...) \
private: \
typedef className SelfType; \
typedef ReflectionHelper::Parents<SelfType, __VA_ARGS__ > ParentList \

Использование класса-сироты:

class TestMetaClassDefine
{
DEFINE_METACLASS(TestMetaClassDefine);     
};

Теперь проблема в том, что __VA_ARGS__ пуст, а

typedef ReflectionHelper::Parents<SelfType, __VA_ARGS__ > ParentList;

недопустимо.

Один из способов решить эту проблему - использовать аргументы шаблона по умолчанию, но это не разрешено для шаблона с переменным числом аргументов.

У кого-нибудь есть техника для решения этой проблемы?

Большое спасибо

1 Ответ

1 голос
/ 27 июля 2011

Препроцессор GCC допускает специальный синтаксис, который исключает последнюю запятую в списке аргументов макропеременных, если список пуст:

#define MACRO(arg, ...) foo(arg, ##__VA_ARGS__)

Это экскапандирует:

MACRO(a,b)   ->  foo(a, b)
MACRO(a)     ->  foo(a )

можете использовать это для вашего DEFINE_METACLASS макроса, чтобы охватить все случаи сразу.

Обновление: Как говорит @Dennis, вы можете использовать свой оригинальный синтаксис в MSVC ++, и он даже не произведетзавершающая запятая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...