Юзкейс метапрограммирования очень узок. Какбы по мне метапрограммирование - это чаще способ затыкать проблемы в системе типов, чем что-то нужное само по себе.
Зависит от проекта. У нас его довольно много, когда в интерпретаторе нужно статически анализировать кучу нативных типов и функций и делать код, который будет конвертировать конкретные типы в универсальное представление "переменной" и обратно, и уметь вызывать нативные функции из интерпретируемого кода, когда имя функции известно как строка, а параметры даны в том универсальном представлении.