Lecture_12-Fucntion_Templates.ppt
- Количество слайдов: 11
Лекция 12. Шаблоны функций Артур Садеков
Шаблоны функций template<class T> void swap(T& a, T&b) { T tmp = a; a = b; b = tmp; } void f() { int a=1, b=2; double c=1. 1, d=2. 2; swap<int>(a, b); swap(c, d); // swap<double>(double, double) swap(a, d); // ошибка !!! } Nortel Networks Confidential Выведение (deduction)
Шаблоны функций для контейнеров template<class T> void sort(vector<T>& v) { const size_t n = v. size(); for(int gap=n/2; 0<gap; gap/=2) for(int i=gap; i<n; i++) for(j=i-gap; 0<=j; j-=gap) if (v[j+gap] < v[j]) swap(v[j], v[j+gap]); } void f(vector<int>& vi, vector<string>& vs) { sort<int>(vi); // sort<string>(vector<string>&) sort(vs); } Nortel Networks Confidential
Аргументы шаблонов функций template<class T, int i> T& search (Buffer<T, i>& b, const char *p); Record& lookup(Buffer<Record, 128>& buf, const char* p) { return search(buf, p); // выведение } template<class T> T* create(); void f() { int *pi = create<int>(); // явный аргумент Record *px = create<Record>(); } Nortel Networks Confidential
Перегрузка шаблонов функций template<class T> T sqrt(T); template<class T> complex<T> sqrt(complex<T>); double sqrt(double); void f(complex<double> z) { sqrt(2); // sqrt<int>(int) sqrt(2. 0); // sqrt(double) sqrt(z); // sqrt<double>(complex<double>) } Nortel Networks Confidential
Специализация шаблонов функций template<class T> bool less(T a, T b) { return a < b; } template<> bool less<const char*>(const char* a, const char* b) { return strcmp(a, b) < 0; } template<> bool less(const char* a, const char* b) { return strcmp(a, b) < 0; } template<class T> void sort(vector<T>& v) { //. . . if ( less(v[j+gap], v[j]) ) swap(v[j], v[j+gap]); } Nortel Networks Confidential
Явное инстанцирование template class Stack<int>; template void Stack<int>: : push(int); template void swap<String>(String, String); Используется: • Если инстанцирование шаблонов отнимает слишком много времени • Если порядок компиляции должен быть абсолютно предсказуем Nortel Networks Confidential
Организация исходного кода (1) • Включаем определения шаблонов до их использования в единице трансляции // out. h #include <iostream> template<class T> void out(const T& a) { std: : cerr << a; } // user 1. cpp #include «out. h» // using out() // user 2. cpp #include «out. h» // using out() Nortel Networks Confidential
Организация исходного кода (2) • Включаем только объявления шаблонов до их использования в единице трансляции, компилируем их определения отдельно (не поддерживается ни одним компилятором) // out. h template<class T> void out(const T& a); // out. cpp #include <iostream> #include «out. cpp» export template<class T> void out(const T& a) { std: : cerr << a; } // user 1. cpp #include «out. h» // using out() Nortel Networks Confidential // user 2. cpp #include «out. h» // using out()
Организация исходного кода (3) • Включаем определения шаблонов до их использования в единице трансляции с использованием #include // out. h // forward declaration template<class T> void out(const T& a); #include “out. cpp” // out. cpp #include <iostream> // This file is not compiled, it is only used to define // a template and is included from “out. h” template<class T> void out(const T& a) { std: : cerr << a; } Nortel Networks Confidential
Конец Nortel Networks Confidential
Lecture_12-Fucntion_Templates.ppt