Пожалуй напишу пояснения к слайду 9, как понял для себя. Класс point, открыто наследуется от класса comparable. Что бы приобрести интерфейс для сравнения объектов point между собой - а именно недостающие операторы =, >. Так как comparable является базовым классом для point, то инстанцировав шаблон comparable классом derived_t = point получаем возможность внутри класса comparable взять указатель this* и как указатель на базовый класс привести его через static_cast к указателю на класс наследника, получив указатель на derived_t, т.е. в нашем случае на объект point (или любой другой объект, для которого будет инстанцирован и сгенерен код шаблона comparable) Таким образом, у нас автоматически будет генерится код для операторов сравнения любого класса, который определил внутри себя operator< и унаследовал класс comparable. А сам объект point, располагаясь в памяти будет сначала иметь шапку из объекта comparable. И обращаясь к операторам сравнения =,> будет вызывать их из базового класса comparable
16:49 Похоже зря лектора сбили с панталыку, скобочки после слова template совершенно не нужны, должно быть: extern template class|struct template-name ; Как, собственно, и было изначально.
2:20 - специализация шаблонного класса
5:13 - частичная специализация
8:22 - общая нешаблонная база
12:00 - явное инстацирование
17:00 - специализация шаблонов функций
19:29 - curiously recurring template pattern
25:20 - typedef для шаблонов
26:35 - наследование и шаблоны. инвариантность шаблонов
30:50 - шаблонная функция в нешаблонном классе
39:45 - динамический vs статический полиморфизм
41:36 - динамический + статический полиморфизм
43:48 - немного про exceptions и smart pointers
Пожалуй напишу пояснения к слайду 9, как понял для себя.
Класс point, открыто наследуется от класса comparable. Что бы приобрести интерфейс для сравнения объектов point между собой - а именно недостающие операторы =, >.
Так как comparable является базовым классом для point, то инстанцировав шаблон comparable классом derived_t = point получаем возможность внутри класса comparable взять указатель this* и как указатель на базовый класс привести его через static_cast к указателю на класс наследника, получив указатель на derived_t, т.е. в нашем случае на объект point (или любой другой объект, для которого будет инстанцирован и сгенерен код шаблона comparable)
Таким образом, у нас автоматически будет генерится код для операторов сравнения любого класса, который определил внутри себя operator< и унаследовал класс comparable.
А сам объект point, располагаясь в памяти будет сначала иметь шапку из объекта comparable. И обращаясь к операторам сравнения =,> будет вызывать их из базового класса comparable
16:49 Похоже зря лектора сбили с панталыку, скобочки после слова template совершенно не нужны, должно быть: extern template class|struct template-name ; Как, собственно, и было изначально.
Да, при наличии скобок имеет место специализация, а без них - явное инстацирование.
Если там кто-то что-то понял с такими пояснениями, то это просто чудо
Не могли бы вы посоветовать в таком случае что то аналогичное но доступное?
Самая сложная лекция за 1 часть 🤯