Используйте метапрограммирование шаблонов только тогда, когда это действительно необходимо
Причина
Метапрограммирование шаблонов сложно написать правильно, замедляет компиляцию и зачастую крайне трудно сопровождать. Тем не менее существуют реальные случаи, когда метапрограммирование шаблонов обеспечивает лучшую производительность, чем любая альтернатива кроме ассемблерного кода уровня эксперта. Также существуют реальные случаи, когда метапрограммирование шаблонов лучше выражает фундаментальные идеи, чем код времени выполнения. Например, если вам действительно нужно манипулировать AST во время компиляции (например, для свёртки матричных операций), в C++ может не быть другого способа.
Пример (плохой)
???
Пример (плохой)
enable_if
Вместо этого используйте концепты. Но смотрите Как эмулировать концепты при отсутствии языковой поддержки.
Пример
??? good
Альтернатива: если результатом является значение, а не тип, используйте constexpr-функцию.
Примечание
Если вы чувствуете потребность скрыть метапрограммирование шаблонов в макросах, вы, вероятно, зашли слишком далеко.