Variadic макросы в CPP (препроцессор C / C ++; для простоты я буду рассматривать его как отдельный, отдельный язык в этом вопросе) крайне ограничены по сравнению, например, с вариационными шаблонами C ++. По сути, переменные макросы - это просто макросы с параметром, аргумент которого может содержать запятые. Это не обеспечивает простой способ подсчета аргументов, оперирования аргументами один за другим и т. Д. Эти вещи возможны , но требуют сложных, запутанных и медленных для компиляции хаков, таких как описанные в этот вопрос . Единственное, что примерно прямо связано с VA_ARGS
, - это передать их в функцию с переменным числом.
Мой вопрос: почему они были разработаны таким образом? Стандартный подход к спискам на любом чисто функциональном языке, таком как CPP, заключается в сопоставлении шаблонов в стиле «против»: обрабатывает первый аргумент списка и рекурсивно для остальных, а также имеет базовый случай для пустого списка. Члены комитета по стандартам были бы хорошо знакомы с этим подходом.
Почему такой подход не использовался для вариационных макросов CPP? Считалось ли, что макросы с переменными числами рассматриваются просто как способ обёртывания функций с переменными числами, чтобы не требовалось оперировать списком аргументов? Была ли какая-то основная проблема, из-за которой было бы нецелесообразно разрешать вариационные макросы повторяться? Или ...?
ПРИМЕЧАНИЕ: я не ищу ответы / комментарии в форме «потому что люди не должны хотеть вариационные макросы». Существование таких вещей, как boost.preprocessor, указывает на то, что разумные люди хотели использовать препроцессор нетривиальными способами. Также не ищите личного мнения о том, почему какой-то другой дизайн был бы хорошей / плохой идеей. Я пытаюсь выяснить фактические рассуждения того времени.