Основы метапрограммирования презентация

Существует 2 разновидности шаблонов: Шаблоны функций. Шаблоны классов. Простое понимание: шаблоны – это универсальные классы и функции, которые работают для любого типа данных. Глубокое понимание: шаблон — это

Слайд 1Основы метапрограммирования


Слайд 2Существует 2 разновидности шаблонов:
Шаблоны функций.
Шаблоны классов.
Простое понимание: шаблоны – это

универсальные классы и функции,
которые работают для любого типа данных.

Глубокое понимание: шаблон — это указания компилятору правил по
созданию классов во время компиляции. Иными словами, это код, результатом
компиляции которого является другой код.

Шаблоны


Слайд 3Шаблоны функций.
Шаблон функции – обобщенная функция, определяющая некую универсальную совокупность операций.
int

min ( int a, int b )
{
return (a < b ? a : b);
}



Слайд 4int min ( int a, int b )
{

return (a < b ? a : b);
}


float min ( float a, float b )
{
return (a < b ? a : b);
}


double min ( double a, double b )
{
return (a < b ? a : b);
}



Слайд 5template
T Min (T a, T b)
{

return ( a < b ? a : b );
}


int minXY = Min (3, 5);

int minXY = Min (3.0, 5.0);



Слайд 6 int x=1,y=3;
Swap(x, y); //

конкретизация для int
std::сout << x << " " << y << std::endl;

template
void Swap(const T & a, const T & b)
{
T tmp;
tmp = a;
a = b;
b = tmp;
}

Шаблонная функция обмена
2-х значений.



Слайд 7template
T Sum (const T & one, const T

& two)
{
return (one + two);
}


Sum(10, 20.0); //ОШИБКА

1) Типовое соответствие

Синтаксические правила


0) Объявление и реализация в h-файле


Слайд 8template
void f (T1 a, T2 b)
{

……
}

2) Используемые в заголовке функции типы должны присутствовать в
заголовке шаблона.



Слайд 9template
void f (T1 a)
{
……..
}
3)

Каждый типовой параметр шаблона должен появиться в списке
формальных параметров функции. Иначе потребуется явная конкретизация.


f(1);


Слайд 10Явная конкретизация типа
template
T Sum(T left, T right)
{
return

(left + right);
}

void main()
{
char x = 1, y = 2;
//std::cout << Sum(x,y); //будет выведен символ

std::cout << Sum (x,y); //char преобразуется в int
}



Слайд 11template
T & Max (const T & a, const

T & b)
{
return ( a > b ? a : b );
}

const char * Max (const char *strA, const char * strB)
{
return ( strcmp (strA, strB) >= 0 ? strA : strB );
}


std::cout << Max (1, 5) << std::endl;
std::cout << Max («aa», «ba») << std::endl;

Специализация шаблонной функции

Реализация шаблонной функции для конкретного типа замещает,
маскирует шаблон (для этого типа).



Слайд 12Алгоритм разрешения ссылки при вызове функции:
1) найти функцию с точно такими

параметрами.
2) если нет - найти шаблонную, порождение которой точно
соответствует по параметрам.
3) если нет – поиск обычной, параметры которой можно преобразовать.

Слайд 13Шаблоны классов
- Шаблон класса описывается подобно обычному классу, но имеет
типовой

параметр, уточнение которого происходит на стадии
компиляции (инстанцирование).

- Это позволяет создавать универсальные структуры данных (массив, список,
очередь, стек,....) и реализовывать универсальные алгоритмы работы с ними.

- Одно из применений данной возможности в классе – хранение и
обработка объектов любого типа.

Такие классы называются контейнерами.

Шаблон класса – это некое общее описание класса, на основе которого
создаются его версии для различных типов данных.


Слайд 14template
class vector
{
T* data;

public:

vector();
~vector();

T & operator [] (int index);
};

Шаблон массива

vector vec;

for(int i=0; i<10; i++) a[i] = i+1;



Слайд 15template
class vector
{
T data [Size];

public:

vector();
T & operator [] ( int index );
};

Нетиповые параметры шаблона

Шаблон одномерного статического массива. Размер – параметр шаблона.



Слайд 16template
vector :: vector()
{
for(int n=0;

n < Size; n++)
data[n] = T();
}

template
T & vector ::operator [] ( int index )
{
return data[index];
}



Слайд 17vector vecNumbers; //конкретизация для

int

vector vecTimes; //конкретизация для класса



Слайд 18template
class vector
{
T * data;
public:
vector (int

size);
~vector();
};

template
vector :: vector (int size)
{
data = new T [size];
for(int i=0; i < size; i++)
data[n] = T();
}

Параметры конструктора

vector vec (100);



Слайд 19template
class Stack
{
T data [Size];

int top;
public:
Stack();
void Push(T item);
T Pop();
};

Шаблон класса стека



Слайд 20template
Stack ::Stack()
{
top = 0;
}

template

T, int Size>
void Stack ::Push(T item)
{
if(top >= Size)
{
assert(false);
}

data [top++] = item;
}


template
T Stack::Pop()
{
if(top <= 0)
{
assert(false);
}

return data[--top];
}



Слайд 21....
Stack st;
for(int i=0; i

i++)
std::cout << st.Pop() << " ";
.....

9 8 7 6 5 4 3 2 1 0



Слайд 22Специализация шаблонов (полная)
template //универсальный шаблон
class vector
{
T* values;

public:

vector();
};


template <>
class vector //шаблон для типа int
{
int* values;

public:
vector();
};



Слайд 23template
int Fact()
{
return n * Fact();
}

template

<>
int Fact<0>()
{
return 1;
}

int main()
{
int f = Fact <5>();

return 0;
}

Шаблон рекурсивного вычисления факториала


Слайд 24template
struct COMPILE_ASSERT_STRUCT
{
};

template
struct COMPILE_ASSERT_STRUCT
{
virtual void dummy() = 0;
};

#define

COMPILE_ASSERT(cond) COMPILE_ASSERT_STRUCT();



void main()
{
const int x = 1;

COMPILE_ASSERT(x > 0);
}

Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика