Здесь есть несколько проблем.
Прежде всего, макросы чрезвычайно глупы, они сложны, но по сути равносильны процессу замены чистого текста.
Поэтому есть2 (технические) проблемы с кодом, который вы раскрыли:
- Вы не можете использовать запятую в середине вызова макроса, она просто терпит неудачу,
BOOST_FOREACH
- это хорошо известная библиотека и пока единственнаяони могли сказать пользователю, что его аргументы не должны содержать запятых, если они не могут быть заключены в круглые скобки, что не всегда так - Даже если замена произошла, ваш код потерпит неудачу в C ++03, потому что это создаст символ
>>
в конце специализации шаблона, который не будет анализироваться правильно.
Существуют приемы предварительной обработки / шаблонного метапрограммирования, однако более простое решение состоит в том, чтобыиспользуйте тип без запятых:
typedef std::vector<int, std::allocator<int> > FooVector;
specialize_AClass(FooVector)
Наконец, существует эстетическая проблема, поскольку из-за их распространенности макросы являютсяt имена, которые не могут конфликтовать с «обычными» (типами, функциями, переменными) именами.Консенсус обычно заключается в использовании всех идентификаторов в верхнем регистре, например:
SPECIALIZE_ACLASS
Обратите внимание, что это не может начинаться с подчеркивания, поскольку стандарт ограничивает использование идентификаторов, соответствующих _[A-Z].*
или [^_]*__.*
авторы компиляторов для стандартной библиотеки или что бы они ни чувствовали (это не смайлики: p)