Скобки в шаблонном аргументе макроса типа, и я не могу использовать переменные макросы

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

Я пытаюсь найти способ заставить это работать без изменения структуры INHERIT:

#define INHERIT(t) foo<t>
template<typename A, typename B>
struct bar : INHERIT(bar<A, B>) {};

Проблема в том, что вызов INHERIT содержит запятую.

Я пытаюсь поддерживать более старые компиляторы, чтобы не использовать переменные макросы и псевдонимы шаблонов. Есть ли способ исправить это?

2

Решение

Используйте немного хитрых макросов:

#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 {};
1

Другие решения

Других решений пока нет …