[10.11.14]

Разбор шаблонов в Scruffy.

1. Внутреннее представление шаблонов.

Различаем два вида шаблонов: шаблоны классов и шаблоны функций.

Внутреннее представление для шаблонов классов идентично представленнию обычных
классов. Для шаблонов классов элемент 'is_template' в объекте 'Class' равен
'true'. Параметры шаблона перечисляются в списке 'template_parameters' объекта
'Class'.

Подобно шаблонам классов, шаблоны функций представляются так же, как и обычные
функции. Для шаблонов функций элемент 'is_template' в объекте 'Function' равен
'true'. Параметры шаблона перечисляются в списке 'template_parameters' объекта
'Function'.

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

Существует три типа параметров шаблона:
    * параметры-типы;
    * параметры-не-типы;
    * параметры-шаблоны.

TODO Как описываются параметры каждого типа?
TODO Рассказать о TypeDesc_Dependent.

2. Инстанцирование шаблонов.

Обращение к шаблонам в C++ производится посредством элементов template-id.

template-id:
    template-name [<] template-argument-list_opt [>]

Все встреченные в коде варианты template-id, относящиеся к шаблону, сохраняются
в списке 'template_instances' объекта 'Class' для шаблонов классов или объекта
'Function' для шаблонов функций. Если аргументы шаблона у двух template-id
совпадают, то эти template-id считаются идентичными и описываются одним общим
объектом 'TemplateInstance'. Аргументы шаблона, использованные в данном
template-id, сохраняются в списке 'template_arguments' объекта
'TemplateInstance'.

Инстанции шаблонов классов описываются объектами 'ClassTemplateInstance',
функций - 'FunctionTemplateInstance'. Эти объекты являются производными от
'TemplateInstance'.

При инстанцировании шаблонов классов создаётся новый объект 'Class',
не являющийся шаблоном. Ссылка на этот объект сохраняется в
'ClassTemplateInstance'. То же делается и для функций (объекты 'Function' и
'FunctionTemplateInstance' соответственно).

3. Зависимые типы и зависимые члены классов.

TODO Рассказать о Member_DependentType и Member_DependentObject.

