Столкнулся с таким вопросом, хотя это возможно больше про дизайн языков. В расте нет non-type template parameters, назовем это так. В С++ уже очень давно можно передавать значение int/size_t как параметр шаблона. Иногда это очень удобно, например у нас есть матрица и мы можем при компиляции проверить, что она квадратная, определив функцию перемножения, как multiply<size_t>(matrix<size_t, size_t> A, matrix<size_t, size_t> B) -> matrix<size_t, size_t> (псевдокод).
Но в реальности то матрицы скорее всего будут загружаться в рантайме из какого-нибудь источника, хотя размеры и могут быть строго заданы: "вот тебе матрица 32x32, а значения я заполню в рантайме". Однако если алгоритм перемножения рекурсивный, Strassen, например, то при компиляции для умножения матриц 32x32 должны будут сгенерироваться процедуры для 16x16, 8x8 и т.д. Т.е. код сильно разбухает. Возникает вопрос как избежать этого trade off'а: и размер в компайл-тайме проверить и код не раздувать. Есть ли какие-то для этого механизмы в языках программирования вообще и в языках без non-type template parameters в частности?