1 2 3 4 5 6 7 8 |
//Листинг #1 Использование параметра шаблона как значения template <typename T, int MAXSIZE> //первый параметр шаблона - тип, второй параметр не тип, а прямое значеник как у параметра функции class MyClass{ MyArray[MAXSIZE]; //Массив int NumElems; //Число элементов внутри него public: }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
//Листинг #2 Параметры шаблонов как значения #include <iostream> using namespace std; template <typename T, int MAXSIZE> class MyClass{ T MyArray[MAXSIZE]; //Массив int NumElems; //Число элементов внутри него public: MyClass<T,MAXSIZE>():NumElems(0){}; //Конструктор класса. При создании объекта в NumElems будет присвоен 0 void Add(int value); void Show() const; }; /*Метод шаблонного класса для вставки значений в элементы класса*/ template <typename T, int MAXSIZE> //Первый аргумент тип, второй аргумент значение void MyClass<T, MAXSIZE>::Add(int value){ if (NumElems==MAXSIZE){ //Проверяем на выход за пределы cout << "Array is full. Value " << value << " is ignored\n"; return; //если ушли, то выходим из функции Add } MyArray[NumElems] = value; //Если есть пустые ячейки в массиве, вписываем значения туда NumElems++; } /*Метод шаблонного класса для отображения данных*/ template <typename T, int MAXSIZE> void MyClass<T,MAXSIZE>::Show() const{ for (int i=0; i<NumElems; i++) cout << MyArray[i] << " "; //Выводим массив с помощью обычного цикла } int main() { MyClass<int,5> MyObj1; for (int i=0; i<10; i++) MyObj1.Add(i+1); //Попытка заполнить массив MyObj1.Show(); cout << "\n\n\n"; MyClass<int,15> MyObj2; for (int i=0; i<25; i++) MyObj2.Add(i+1); //Попытка заполнить массив MyObj2.Show(); } |
1 |
template <typename T,const int MAXSIZE=100> //В T приходит тип, а в MAXSIZE значение, если в MAXSIZE ничего не приходит, оно по умолчанию устанавливается в 100 |
1 |
MyClass<int> MyObj3; //В MAXSIZE будет 100, а значит в массив поместится 100 элементов |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Листинг #3 Шаблонные параметры у шаблонныз функций #include <iostream> #include <vector> #include <algorithm> using namespace std; template <typename T, int VAL> //Шаблонная функция. У шаблона 2 параметра тип и не тип T addValue(T const& x){ return x+VAL; } int main() { vector<int> v1(10); vector<int> v2(10); transform(v1.begin(), v1.end(),v2.begin(),addValue<int,5>); for ( vector<int>::iterator it = v2.begin(); it!=v2.end(); ++it) cout<< *it <<" "; } |
1 |
template <typename T, int VAL = 200> //Шаблонная функция. У шаблона 2 параметра тип и не тип |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//Листинг #4 #include <iostream> using namespace std; template <typename T, typename T2, int VAL = 200> //Шаблонная функция. У шаблона 2 параметра тип и не тип T2 addValue(T2 const& x){ return x+VAL; } int main(){ const int N = 10; int arr1[N]; int arr2[N]; for (int i=0; i<N; i++) addValue<int[N], int, i>(123); //Используем 2 аргумента для функции addValue } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//Листинг #5 #include <iostream> using namespace std; template <typename T, typename T2, int VAL = 200> //Шаблонная функция. У шаблона 2 параметра тип и не тип void addValue(T2& x){ x+=VAL; } int main(){ const int N = 10; int arr1[N] = {1, 2, 3, 4, 5}; int arr2[N] = {10, 20, 30, 40, 50}; for (int i=0; i<N; i++) addValue<int, int>(arr1[i]); //Используем 2 из 3 аргументов для шаблона и 1 из 1 аргумент для функции addValue for (int i=0; i<N; i++) addValue<int, int, 77>(arr2[i]); //Используем 3 из 3 аргументов для шаблона и 1 из 1 аргумент для функции addValue cout << "arr1:\n"; for (int i=0; i<N; i++) cout << arr1[i] << '\t'; cout << "\narr2:\n"; for (int i=0; i<N; i++) cout << arr2[i] << '\t'; } |
Добавить комментарий