Обобщённое программирование

Содержание

Слайд 2

Написать функцию сортировки массива интов

Важно, очень простая задачка вверху!

Написать функцию сортировки массива интов Важно, очень простая задачка вверху!

Слайд 3

void sortArr(int* arr, int size_arr) {
for (int i{}; i < size_arr -

void sortArr(int* arr, int size_arr) { for (int i{}; i for (int
1; ++i) {
for (int j{i + 1}; j < size_arr; ++j) {
if (arr[i] > arr[j]) {
std::swap(arr[i], arr[j]);
}
}
}
}

Слайд 4

Написать функцию сортировки массива даблов

Написать функцию сортировки массива даблов

Слайд 5

void sortArr(double* arr, int size_arr) {
for (int i{}; i < size_arr -

void sortArr(double* arr, int size_arr) { for (int i{}; i for (int
1; ++i) {
for (int j{i + 1}; j < size_arr; ++j) {
if (arr[i] > arr[j]) {
std::swap(arr[i], arr[j]);
}
}
}
}

Слайд 6

Написать функцию сортировки массива char - ов

Написать функцию сортировки массива char - ов

Слайд 7

void sortArr(char* arr, int size_arr) {
for (int i{}; i < size_arr -

void sortArr(char* arr, int size_arr) { for (int i{}; i for (int
1; ++i) {
for (int j{i + 1}; j < size_arr; ++j) {
if (arr[i] > arr[j]) {
std::swap(arr[i], arr[j]);
}
}
}
}

Слайд 8

Написать функцию сортировки массива bool – ов (ну, а что? а вдруг?!)

Написать функцию сортировки массива bool – ов (ну, а что? а вдруг?!)

Слайд 9

void sortArr(bool* arr, int size_arr) {
for (int i{}; i < size_arr -

void sortArr(bool* arr, int size_arr) { for (int i{}; i for (int
1; ++i) {
for (int j{i + 1}; j < size_arr; ++j) {
if (arr[i] > arr[j]) {
std::swap(arr[i], arr[j]);
}
}
}
}

Слайд 10

Псс, люди, ничего не заметили? Давайте ещё раз, найдите 5 отличий:

Псс, люди, ничего не заметили? Давайте ещё раз, найдите 5 отличий:

Слайд 11

void sortArr(bool* arr, int size_arr) {
for (int i{}; i < size_arr -

void sortArr(bool* arr, int size_arr) { for (int i{}; i for (int
1; ++i) {
for (int j{i + 1}; j < size_arr; ++j) {
if (arr[i] > arr[j]) {
std::swap(arr[i], arr[j]);
}
}
}
}

Слайд 12

void sortArr(int* arr, int size_arr) {
for (int i{}; i < size_arr -

void sortArr(int* arr, int size_arr) { for (int i{}; i for (int
1; ++i) {
for (int j{i + 1}; j < size_arr; ++j) {
if (arr[i] > arr[j]) {
std::swap(arr[i], arr[j]);
}
}
}
}

Слайд 13

void sortArr(double* arr, int size_arr) {
for (int i{}; i < size_arr -

void sortArr(double* arr, int size_arr) { for (int i{}; i for (int
1; ++i) {
for (int j{i + 1}; j < size_arr; ++j) {
if (arr[i] > arr[j]) {
std::swap(arr[i], arr[j]);
}
}
}
}

Слайд 14

void sortArr(char* arr, int size_arr) {
for (int i{}; i < size_arr -

void sortArr(char* arr, int size_arr) { for (int i{}; i for (int
1; ++i) {
for (int j{i + 1}; j < size_arr; ++j) {
if (arr[i] > arr[j]) {
std::swap(arr[i], arr[j]);
}
}
}
}

Слайд 15

Везде меняется только тип! Не слишком ли жирно, писать кучу кода РУКАМИ,

Везде меняется только тип! Не слишком ли жирно, писать кучу кода РУКАМИ,
когда в нём меняется только одно слово???! – СЛИШКОМ! Именно для этого, придумали такую штуку, как шаблон кода! А ещё, такую замечательную парадигму, как – ОБОБЩЁННОЕ ПРОГРАММИРОВАНИЕ!

Слайд 16

Обобщённое программирование -

Принцип написания кода согласно которому, следует писать такие алгоритмы,

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

Слайд 17

Шаблон кода

Написание куска кода, пренебрегая типами данных, которыми он управляет.

Шаблон кода Написание куска кода, пренебрегая типами данных, которыми он управляет.

Слайд 18

Шаблон кода (более формально – беее, много букв)

Это обобщенное описание поведения функций,

Шаблон кода (более формально – беее, много букв) Это обобщенное описание поведения
которые могут вызываться для объектов разных типов. Другими словами, шаблон функции (шаблонная функция, обобщённая функция) представляет собой семейство разных функций (или описание алгоритма). По описанию шаблон функции похож на обычную функцию: разница в том, что некоторые элементы не определены (типы, константы) и являются параметризованными.

Слайд 19

Хватит теории, давайте практику!

Хватит теории, давайте практику!

Слайд 20

ВО!

template<>

ВО! template

Слайд 21

Превратим кучу функций в одну:

template
void sortArr(T* arr, int size_arr) {
for (int

Превратим кучу функций в одну: template void sortArr(T* arr, int size_arr) {
i{}; i < size_arr - 1; ++i) {
for (int j{i + 1}; j < size_arr; ++j) {
if (arr[i] > arr[j]) {
std::swap(arr[i], arr[j]);
}
}
}
}

Слайд 22

Рассмотрим, что ещё можно делать: Типов может быть больше одного

template

Рассмотрим, что ещё можно делать: Типов может быть больше одного template void
typename B, typename K>
void testFunc(T* arr_1, A* arr_2, B* arr_3, K* arr_4) {
}

Слайд 23

Или вообще бесконечное кол – во:

void myPrint() {
cout << endl;
}
template

Или вообще бесконечное кол – во: void myPrint() { cout } template
typename ...moreTypes>
void myPrint(const firstType &value, const moreTypes &...other) {
cout << value << endl;
myPrint(other...);
}

Слайд 24

int main() {
myPrint(
"This is string",
'C',
12,
48.5,
"WOW!"
);

int main() { myPrint( "This is string", 'C', 12, 48.5, "WOW!" ); return 0; }
return 0;
}

Слайд 25

Вызов шаблонных функций:

template
T sum(T a, T b) {
return a + b;
}

int

Вызов шаблонных функций: template T sum(T a, T b) { return a
main() {
// либо так
cout << sum(1, 2) << endl;
// либо так
cout << sum(1, 2) << endl;
return 0;
}

Слайд 26

Параметры, которые не являются типами:

template
T getSumArr(T (&arg)[S]) {
T

Параметры, которые не являются типами: template T getSumArr(T (&arg)[S]) { T sum{};
sum{};
for (const T &it : arg) {
sum += it;
}
return sum;
}

Слайд 27

Вызов, вообще магия )

int arr[5]{1, 2, 3, 4, 5};
cout << getSumArr(arr) <<

Вызов, вообще магия ) int arr[5]{1, 2, 3, 4, 5}; cout
endl;

Слайд 28

Шаблон шаблона, шаблона, шаблона, шаб…, ну вы поняли

template typename

Шаблон шаблона, шаблона, шаблона, шаб…, ну вы поняли template typename Arr> void
Arr>
void testFunc() {
T var;
Arr a;
};

Слайд 29

Аргументы шаблона по умолчанию

template > class vector;

Аргументы шаблона по умолчанию template > class vector;

Слайд 30

Специализация шаблонов

template
void sortArr(T* arr, int size_arr) {
for (int i{}; i <

Специализация шаблонов template void sortArr(T* arr, int size_arr) { for (int i{};
size_arr - 1; ++i) {
for (int j{i + 1}; j < size_arr; ++j) {
if (arr[i] > arr[j]) {
std::swap(arr[i], arr[j]);
}
}
}
}

template<>
void sortArr(bool* arr, int size_arr) {
cout << "Кх, ну ты это, ну, не шути так, не надо" << endl;
}

Слайд 31

Экземпляры шаблонов

template
T sum(T a, T b) {
return a + b;
}
template int

Экземпляры шаблонов template T sum(T a, T b) { return a +
sum(int, int);

Слайд 32

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

Всё на столько просто, что писать нечего :)

Инстанциирование шаблонов Всё на столько просто, что писать нечего :)

Слайд 33

Перегрузка шаблонов

template
T sqrt(T);
template
complex sqrt(complex);
double sqrt(double);
void fun(complex z) {
sqrt(2);
sqrt(2.0);

Перегрузка шаблонов template T sqrt(T); template complex sqrt(complex ); double sqrt(double); void
sqrt(z);
}

Слайд 34

Шаблоны классов

Всё стандартно, точно также, как для функций

Шаблоны классов Всё стандартно, точно также, как для функций