Нет, потому что вызов макроса MAKE_TEMPLATE()
вообще не имеет нулевых аргументов;у него есть один аргумент, содержащий ноль токенов.
Старые препроцессоры, по-видимому, включая GCC на момент написания этого ответа, иногда интерпретировали пустой список аргументов, как вы надеетесь, но консенсус сместился в сторону более строгого подхода,более узкое расширение, которое более точно соответствует стандарту.
Чтобы получить приведенный ниже ответ, определите дополнительный параметр макроса перед многоточием:
#define MAKE_TEMPLATE(UNUSED, ...) template <typename T, ## __VA_ARGS__ >
, а затем всегда ставьте запятую передпервый аргумент, когда список не пустой:
MAKE_TEMPLATE(, foo )
Старый ответ
Согласно http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html, GCC поддерживает это, но не прозрачно.
Синтаксисis:
#define MAKE_TEMPLATE(...) template <typename T, ## __VA_ARGS__ >
В любом случае, оба также поддерживают шаблоны переменных в режиме C ++ 0x, что гораздо предпочтительнее.