Возможный дубликат:
Проблема с параметрами шаблона, используемыми в макросах
Я пытаюсь найти способ заставить это работать без изменения структуры INHERIT
:
#define INHERIT(t) foo<t>
template<typename A, typename B>
struct bar : INHERIT(bar<A, B>) {};
Проблема в том, что вызов INHERIT
содержит запятую.
Я пытаюсь поддерживать более старые компиляторы, чтобы не использовать переменные макросы и псевдонимы шаблонов. Есть ли способ исправить это?
Используйте немного хитрых макросов:
#define A2(t1,t2) t1,t2
#define A3(t1,t2,t3) t1,t2,t3
#define A4(t1,t2,t3,t4) t1,t2,t3,t4
#define INHERIT(t) foo< t >
template<typename A, typename B>
struct bar : INHERIT(bar<A2(A, B)>) {};
Эти макросы приводят к тому, что препроцессор перестает воспринимать запятую как ее синтаксис — запятая начинает рассматриваться как часть аргумента.
Альтернативный способ:
#define bar_A_B bar<A,B>
template<typename A, typename B>
struct bar : INHERIT(bar_A_B) {};
НОТА
Эти примеры не компилируются без:
template <class T>
class foo {};
Других решений пока нет …