Step 2 (S-11548)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/567/step/2

Step 2 (S-11548) 1.png

[00:00 - 00:15] в последнем уроке даже неделе мы завершим разговор что мы поговорим о некоторых возможностях шаблонов про который мы не знали до этого мы обсудим как происходит операция шаблонов а также подберем резюме касательно использования шаблонов и программ


[00:15 - 00:32] и давайте начнем с типовых параметров шаблона во всех примерах использования шаблонов которые мы рассматривали до этого в качестве шаблонных параметров передавались типа оказывается что шаблонные параметры могут быть не только типа параметрами шаблонов могут быть не только типа


[00:32 - 00:47] но и целочисленные значения значение некоторых целого типа например это могут быть также указатели или ссылки назначения с внешней линковкой


[00:47 - 01:02] как указать рисунке понятно каков я расскажу немного позже и шаблоны при этом у нас уже были примеры когда в качестве шаблона параметра по уже давно параметров передавался некоторых


[01:02 - 01:18] другой шаблон и тип например это может быть предателем re от int однако в данном случае подразумевается что в качестве шаблона параметры передаются не шаблонный класс с уже подставленную шаблонными параметрами а шаблоны классом по себе


[01:18 - 01:37] каких то конкретных шаблоны знаю как это использовать я поясню на следующем то на данном слайде давайте разберемся с целочисленными шаблонными параметрами и с указателями сок значительные шаблоны вам это использовании так например можно определить какой класс матрицы которая будет 3 шаблоны память


[01:37 - 01:53] 1 типовой шаблонный параметр тобой тип t тип элементов данной матрице не будет 2 целочисленных шаблонные параметры параметры которые заняты размерность эта матрица это количество


[01:53 - 02:11] строк количество столбцов эти значения значение n должны быть определены на этапе компиляции почему потому что все типы обрабатывается этапе компиляции вот с компьютером и никаких типов уже нету


Step 2 (S-11548) 2.png

[02:11 - 02:28] нам важно чтобы эти значения были на этапе компиляции и проанализированы и соответственно можно было сравнить 2 типа равны они не равны по каждому типу узнать сколько он занимается на востоке ну и так далее то есть значение м м обязаны быть


[02:28 - 02:46] известно на этапе компиляции то есть они могут прочитаны стандартную воду там с файла сгенерированы чем случайно чисел и прочее это некто ограничения но с другой стороны такой подход позволяет нам сделать матрица с разными


[02:46 - 03:06] размерностями матрицами разных типов то есть эти матрицы просто не забыть перепутать в матрице с различными значениями н м это будут 2 объекта разных типов например использует такой подход легко определить операции умножения у которой не будет а ошибок


[03:06 - 03:23] от того что мы данной матрице нельзя перемножать как это делается делается это следующим образом если помните из курса линейной алгебры переночевать можно только матрица в котором внутренние размеры совпадают то есть переносить матрица размером n


[03:23 - 03:41] я могу и перемножить только с такую матрицу которая 1 размерность будет такая же то есть но на некоторые и это


[03:41 - 03:57] условия мы можем отразить непосредственно в описании функции как это делается мы описываем оператор ношения то есть внешняя функцию которая является свою очередь шаблонный нее есть


[03:57 - 04:16] шаблонный параметр это тип элементов матрицы которая здесь нажраться это размерность 1 матрица размером с 1 матрице и соответствии 1 размер матрицы и количество столбцов во 2 матрице мы вот эти числа


[04:16 - 04:34] n n и как которые определяют размерности матрицы которая умножаем здаем шаблонами параметров и теперь мы можем определить этот оператор таким образом чтобы он нашел только матрица с правильными размерность то есть в качестве 1 аргумента можно передать только матрицу


[04:34 - 04:52] размерности м м а во 2 соответственно матрица размерности м и к если мы передадим сюда где матрицу которых внутренние размерность не совпадают то есть если например эмо здесь нет то просто


[04:52 - 05:07] мы пытались вырвать эту функцию с теми типами для которых она неопределенно поэтому никакого не будет то есть таким образом за счет системы типов мы защищаем себя от ошибок более того мы сразу же можно написать


[05:07 - 05:26] какой размерности будет матрица которую мы вернем из этого оператора ее размерность будет если мы не можем таки матрица размером будет n на к тестам и 10 и записывает что возвращается матрица элемент которой имеют те кто а размерностью однако


[05:26 - 05:45] можно придумать множество других использований для отечественных шаблонных параметров это могут быть как электорат точки в мерном пространстве это могут быть массивы фиксированного размера это могут быть битовой маске конкретного количество бит бомбит советы


Step 2 (S-11548) 3.png

[05:45 - 06:04] ну и так далее важно только понимать что значение этих параметров оно должно быть известно на этапе компиляции это значительно ограничивает использование значительных шаблонных параметров потому что мы не можем прочитать из файла и стандартно вот теперь давайте поговорим об указателях и сок


[06:04 - 06:22] но идеологически понятно что принципе параметром шаблона может быть указать или соком важный момент является то что это рука пересылка должны соответствовать некоторому значению со внешней линковки то есть вот в этой фразе


[06:22 - 06:37] кроется основное ограничения это ограничения оно аналогично тому что значение для прочитанных параметры должны быть известны этапе компиляции то есть и здесь важно чтобы


[06:37 - 06:52] то значение на которое будет ссылаться данная ссылка и указывается там указатель оно должно быть известно на этапе компиляции при этом она должна быть некоторые глобальные знания на практике это означает что такое глобальное значение должно быть либо


[06:52 - 07:07] глобальной переменной либо глобальных переменных в некотором смысле то есть например статическое поле класса обсуждали статической по рекламе это по сути глобальной переменной глобальной переменной который проходит в них не линковку так же как то и


[07:07 - 07:27] обычный глобальной переменной вот если мы будем ссылаться на такие глобальные значение то такие указатели ссылке можно использовать в качестве шаблона дать пример рассмотрим на практике в действительности это возможно полиса очень редко но можно придумать какой например


[07:27 - 07:43] например можно рассмотреть такой класс логгер логгер есть класс который записывает протокол работы вашей программы о том что произошло соединение с базой данных там какая то ошибка это что и так далее то есть описывать что происходит в процессе работы вашей программы и


[07:43 - 08:02] вот это то есть протокол работы 0 записываться можно записываться на стандарт вывод можно описывается for давайте рассмотрим блогер который записывает в некоторых в вашем же может быть несколько логин чтобы разделить эти лагеря их не перепутать можно сказать что


[08:02 - 08:19] вот и разные есть они пишут разные файлы если набор артефактов известен на этапе компиляции светулька несколько файлов которые на этапе компиляции нет в программе зашиты все известно чему они соответствуют и соответственно раз


[08:19 - 08:34] интересно то это можно сделать некоторые глобальные перемены тогда ссылку на данный файл ну или указатель на него можно сделать параметром шаблона в данном случае параметрам шаблон является ссылкой на


[08:34 - 08:53] о встрече таким образом из нас будет 2 файла который будто разные файлы ну разные файлы даже методу в разные объекты типа австрию то эти блогеры будут просто различными типами их нельзя будет перепутать нельзя будет там передать 1 файл логгер функции вместо другого


[08:53 - 09:09] но важный момент так же как и в случае с начальными титрами что этот файл смысле значение о встрече даже мы тебе глобальной переменной либо статическим полем класса