Шаблоны: статически или динамически? - PullRequest
2 голосов
/ 02 января 2012

C ++ считается статически типизированным. Я понимаю это.

Я не понимаю, как это относится к шаблонам.

Вот простой пример типа, который нельзя определить во время компиляции:

template <typename... t>
struct foo {
  using type = typename foo<t..., t...>::type;
};

foo<int>::type x; // type of x cannot be determined without running meta-program

Полагаю, есть случаи, когда невозможно обнаружить ошибки типа без решения проблемы остановки.

Итак, мой вопрос: почему шаблоны не считаются динамически типизированными?

1 Ответ

7 голосов
/ 02 января 2012

Статическая / динамическая типизация обычно относится к поведению во время выполнения окончательной скомпилированной программы, а не метапрограммы.Поскольку foo<int>::type разрешается к тому времени, когда вы достигнете времени выполнения окончательной скомпилированной программы, она считается статически типизированной.

Что касается метапрограммы шаблона, можно считать, что она использует типизацию с утиной настройкой, которая является своего родадинамическая типизация.Однако обратите внимание, что все еще существуют статические типы (в пре-C ++ 11) - количество аргументов шаблона в шаблоне можно считать мета-типом для мета-функции, которая создает конкретный тип (который является значениемчто касается метапрограммы).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...