Статическая / динамическая типизация обычно относится к поведению во время выполнения окончательной скомпилированной программы, а не метапрограммы.Поскольку foo<int>::type
разрешается к тому времени, когда вы достигнете времени выполнения окончательной скомпилированной программы, она считается статически типизированной.
Что касается метапрограммы шаблона, можно считать, что она использует типизацию с утиной настройкой, которая является своего родадинамическая типизация.Однако обратите внимание, что все еще существуют статические типы (в пре-C ++ 11) - количество аргументов шаблона в шаблоне можно считать мета-типом для мета-функции, которая создает конкретный тип (который является значениемчто касается метапрограммы).
Для сравнения, в Haskell у них есть концепция иерархии типов.У вас есть типичные типы - такие как функции, целые числа и т. Д. Затем у вас есть «виды», которые описывают типы и мета-функции на типах.Например, тип Haskell * -> * -> *
может ссылаться на сопоставление ключей со значениями, очень похожее на template<typename Key, typename Value> class Map
в C ++.Любое определение того, является ли язык статически или динамически типизированным, должно было бы указывать, на какой уровень иерархии вы ссылаетесь.Исторически сложилось так, что шаблоны C ++ никогда не рассматривались как метапрограммы при их первоначальном проектировании, поэтому этот вид терминологии не так широко используется в C ++, но те же концепции могут применяться.