'

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

Понравилась презентация – покажи это...





Слайд 0

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


Слайд 1

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


Слайд 2

3 Шаблоны функций. Шаблон функции – обобщенная функция, определяющая некую универсальную совокупность операций. int min ( int a, int b ) { return (a < b ? a : b); }


Слайд 3

4 int 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); }


Слайд 4

5 template <class T> T Min (T a, T b) { return ( a < b ? a : b ); } int minXY = Min (3, 5); int minXY = Min (3.0, 5.0);


Слайд 5

6 int x=1,y=3; Swap(x, y); // конкретизация для int std::сout << x << " " << y << std::endl; template <class T> void Swap(const T & a, const T & b) { T tmp; tmp = a; a = b; b = tmp; } Шаблонная функция обмена 2-х значений.


Слайд 6

7 template <class T> T Sum (const T & one, const T & two) { return (one + two); } Sum(10, 20.0); //ОШИБКА 1) Типовое соответствие Синтаксические правила 0) Объявление и реализация в h-файле


Слайд 7

8 template <class T1> void f (T1 a, T2 b) { …… } 2) Используемые в заголовке функции типы должны присутствовать в заголовке шаблона.


Слайд 8

9 template <class T1, class T2> void f (T1 a) { …….. } 3) Каждый типовой параметр шаблона должен появиться в списке формальных параметров функции. Иначе потребуется явная конкретизация. f<int, int>(1);


Слайд 9

10 Явная конкретизация типа template <class T> T Sum(T left, T right) { return (left + right); } void main() { char x = 1, y = 2; //std::cout << Sum(x,y); //будет выведен символ std::cout << Sum <int> (x,y); //char преобразуется в int }


Слайд 10

11 template <class T> 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; Специализация шаблонной функции Реализация шаблонной функции для конкретного типа замещает, маскирует шаблон (для этого типа).


Слайд 11

12 Алгоритм разрешения ссылки при вызове функции: 1) найти функцию с точно такими параметрами. 2) если нет - найти шаблонную, порождение которой точно соответствует по параметрам. 3) если нет – поиск обычной, параметры которой можно преобразовать.


Слайд 12

13 Шаблоны классов - Шаблон класса описывается подобно обычному классу, но имеет типовой параметр, уточнение которого происходит на стадии компиляции (инстанцирование). - Это позволяет создавать универсальные структуры данных (массив, список, очередь, стек,....) и реализовывать универсальные алгоритмы работы с ними. - Одно из применений данной возможности в классе – хранение и обработка объектов любого типа. Такие классы называются контейнерами. Шаблон класса – это некое общее описание класса, на основе которого создаются его версии для различных типов данных.


Слайд 13

14 template <class T> class vector { T* data; public: vector(); ~vector(); T & operator [] (int index); }; Шаблон массива vector<int> vec; for(int i=0; i<10; i++) a[i] = i+1;


Слайд 14

15 template <class T, int Size> class vector { T data [Size]; public: vector(); T & operator [] ( int index ); }; Нетиповые параметры шаблона Шаблон одномерного статического массива. Размер – параметр шаблона.


Слайд 15

16 template <class T, int Size> vector <T, Size>:: vector() { for(int n=0; n < Size; n++) data[n] = T(); } template <class T, int Size> T & vector <T, Size>::operator [] ( int index ) { return data[index]; }


Слайд 16

17 vector <int,10> vecNumbers; //конкретизация для int vector <Time,100> vecTimes; //конкретизация для класса


Слайд 17

18 template <class T> class vector { T * data; public: vector (int size); ~vector(); }; template <class T> vector <T>:: vector (int size) { data = new T [size]; for(int i=0; i < size; i++) data[n] = T(); } Параметры конструктора vector <int> vec (100);


Слайд 18

19 template <class T, int Size> class Stack { T data [Size]; int top; public: Stack(); void Push(T item); T Pop(); }; Шаблон класса стека


Слайд 19

20 template <class T, int Size> Stack <T,Size>::Stack() { top = 0; } template <class T, int Size> void Stack <T,Size>::Push(T item) { if(top >= Size) { assert(false); } data [top++] = item; } template <class T, int Size> T Stack<T,Size>::Pop() { if(top <= 0) { assert(false); } return data[--top]; }


Слайд 20

21 .... Stack <int, 10> st; for(int i=0; i<10; i++) st.Push(i); for(i=0; i<10; i++) std::cout << st.Pop() << " "; ..... 9 8 7 6 5 4 3 2 1 0


Слайд 21

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


Слайд 22

23 template <int n> int Fact() { return n * Fact<n-1>(); } template <> int Fact<0>() { return 1; } int main() { int f = Fact <5>(); return 0; } Шаблон рекурсивного вычисления факториала


Слайд 23

24 template <bool cond> struct COMPILE_ASSERT_STRUCT { }; template<> struct COMPILE_ASSERT_STRUCT<false> { virtual void dummy() = 0; }; #define COMPILE_ASSERT(cond) COMPILE_ASSERT_STRUCT<bool(cond)>(); void main() { const int x = 1; COMPILE_ASSERT(x > 0); }


×

HTML:





Ссылка: