Безопасная передача аргументов шаблона через макросы? - PullRequest
5 голосов
/ 29 декабря 2011

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

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

1 Ответ

3 голосов
/ 29 декабря 2011

одно из многих решений, использующих повышение pp

#define INSTANTIATE_MYTYPE(DATA)                          \
template <BOOST_PP_SEQ_ELEM(0,DATA)>                      \
struct MyType <BOOST_PP_SEQ_ELEM(1,DATA)> {               \
    static const bool value = BOOST_PP_SEQ_ELEM(2,DATA);  \
}

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

далее читайте: http://www.boostpro.com/mplbook/preprocessor.html

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