C++ lectures at MIPT (in Russian). Lecture 3. Class templates, part 1

preview_player
Показать описание
Лекции в магистратуре МФТИ по C++ на русском языке.

Третья лекция посвящена шаблонам классов. Рассматриваются специализация, частичная специализация, двухфазное разрешение имён и многое другое.

Лектор: Константин Владимиров
Дата лекции: 17 сентября 2019 года
Съёмка: Дмитрий Рябцев

Список замеченных ошибок в лекции:
тут пока пусто

Больше багфикса в комментариях приветствуется!
Рекомендации по теме
Комментарии
Автор

36:00 Про частичную специализацию шаблонов функций есть у Вандервуда в ч. 17.3.
Он приводит пример, в котором из-за возможности перегрузки функций не понятно, какой из шаблонов специализирован:

template <typename T> void add(T х, int i) {} // Первичный шаблон
template <typename T1, typename T2> void add(T1 х, T2 i) {} // Другой (перегруженный) первичный шаблон
template <typename T> void add<T *>(T *&, int) {} // Какой из первичных шаблонов специализирован?

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

Также, в 2000-ом, был пропозал от Абрамса, в котором предлагалось добавить частичную специализацию [1]. Пропозал отклонили с комментарием, что функционал частичной специализации будет реализован через concept_map [3] из концептов C++0x:

> Most of this functionality can be offered through concept_maps, so I suggest it is not worth the effort to write such a tricky extension purely for the benefit of unconstrained templates in the future. [2]

Так что частичную специализацию шаблонов функций не ввели из-за возможных сложностей с перегрузкой и по историческим причинам (т.к. concept_maps не были приняты).

theswere
Автор

58:00 Пример "TS"
Разные версии компиляторов выдают разные результаты:
Clang 12.0.0 (i686-pc-windows-msvc): "SS".
VC++ (v142): "TS".
Более старые версии VC++ также выдают: "SS".

xdtaux
Автор

44:00 Про пингвинов обидно было 🐧 :) Поющие птицы это частный случай некоторых из птиц, которые умеют петь, а не всех. Поэтому пингвины могут быть птицами, но не могут наследоваться от поющих птиц. Но пример хороший, спасибо!

VolodymyrBabchak
Автор

1:0:46 сначала долго думал почему надо вызвать именно exit() из Base, думал, что защищаемся от вызова exit() из Derived, но почему тогда не кастим this к Base *? Потом только понял, что у Derived нет своего exit(), а защищаемся от вызова какой-нибудь внешней свободной функции с таким именем. Не уверен только что это действительно связано с тем, что компилятор считает this-> зависящим от T (хотя он ведь реально зависит), а не просто видит this->, а значит надо вызвать мембер-функцию. Наверное проверить можно на MSVC до 17 года, где двухфазное разрешение имён было сломано (или отключить флажком).

samolisov
Автор

Насчёт специализаций функций... Тут такое дело...
It is undefined behavior to declare a full specialization of any standard library function template.

(since C++20)
Так что специализация std::swap дело плохое. А вот сделать перегрузку можно(если она зависит от твоих типов)(насколько мне известно нет прямого запрета прямо уж на всё в namespace std, кроме деклараций чего-то нового)

niklkelbon
Автор

53:47, слайд 47
VS2017 выдаёт SS
Компайлер замечает, что foo внизу лучше подходит)

timurtsotniashvili
Автор

что-то не совсем понятно какой плей-лист смотреть, этот или "базовый курс с++" ? то что есть там - нет тут, то что есть тут - нет там, хотя и там и там базовые вещи вроде бы

Вовик-дл
Автор

осмелюсь предложить такое решение задачи параметризации методов. оно ведь правильно?

#include <iostream>

template <typename T1, typename T2> struct A {
void func() { std::cout << "COMMON" << std::endl; }
};
template <typename T> struct A<int, T> {
void func() { std::cout << "INT" << std::endl; }
};
int main() {
A<int, double> a;
A<float, double> b;
a.func();
b.func();
return 0;
}

$ clang++ a.cc
$ ./a
INT
COMMON

АлександрМитрохин-рд
Автор

Почему в наймспейте std нельзя вводить новые сущности ? это не верно.

xdtaux