Безопасная передача запятых аргументов шаблона через макросы?

В настоящее время я использую макросы для более краткого объявления относительно длинных списков частично специализированных классов шаблонов.Далее следуют несколько упрощенные примеры:

#define INSTANTIATE_MYTYPE(freeargs, specialization, myvalue) \
template <freeargs> \
struct MyType <specialization> {
  static const bool value = myvalue;
}

Это отлично работает, если у меня нет запятых для передачи в каждом случае:

INSTANTIATE_MYTYPE(typename T, std::vector<T>, true);

И есть приемлемый обходной путь, если у меня есть запятая для передачи через один уровень расширения макроса:

#define MacroComma ,
INSTANTIATE_MYTYPE(typename S MacroComma typename T,
                   std::pair<S MacroComma T>, true);

Но это не удается, если я пытаюсь добавить дополнительный уровень макросов:

#define INSTANTIATE_ALL(freeargs, specialization, myvalue) \
INSTANTIATE_MYTYPE(freeargs, specialization, myvalue); \
INSTANTIATE_ANOTHERTYPE(freeargs, specialization, myvalue); \
INSTANTIATE_ATHIRDTYPE(freeargs, specialization, myvalue)
// etcetera

INSTANTIATE_ALL(typename S MacroComma typename T,
                std::pair<S MacroComma T>, true);

Попытки добавить дополнительный уровень косвенного обращения к макросам (через #define MacroComma2 MacroComma или различные другие попытки) терпят неудачу. Дополнительные круглые скобки не работают, если подстановка выполняется внутри списка аргументов шаблона. Кажется, есть трюк с вариативными макросами, который мог бы работать, но я пытаюсь сохранить соответствие стандарту C ++ 2003. Можно ли каким-то образом умножить "escape" запятую в макросе в C ++ 2003?

В качестве альтернативы, есть ли краткий способ объявить длинные списки частичных специализаций без использования макросов вообще? Мой гугл-фу не нашел ничего подходящего, но похоже, что должен быть какой-то трюк с метапрограммированием списка типов.

5
задан roystgnr 28 December 2011 в 22:22
поделиться