В настоящее время я использую макросы для более краткого объявления относительно длинных списков частично специализированных классов шаблонов.Далее следуют несколько упрощенные примеры:
#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?
В качестве альтернативы, есть ли краткий способ объявить длинные списки частичных специализаций без использования макросов вообще? Мой гугл-фу не нашел ничего подходящего, но похоже, что должен быть какой-то трюк с метапрограммированием списка типов.