В общем, что такое кодогенерация как для меня - это двухэтапный процесс, когда у нас имеется некий шаблонизатор и директивный язык со своей семантикой, который генерит с помошью отдельной утилиты собственно сам код, который уже на втором этапе обрабатывается основным компилятором. Макросы и дженерики - это уже часть семантики основного ЯП, они управляются, валидируются и генерируются на этапе компиляции (препроцессинга)