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