class DarkRaha extends com { // разработка приложений
            String a="Главная" b="Контакты" c="О сайте"
};

STL

основы

введение
Инструментарий
Проекты в C++
Комментарий
Утверждения
Идентификаторы
Область видимости
Литералы
Типы данных, переменные
Константы, перечисления
Выражения и операции
Агрегатные типы
Указатели
Ссылки
Массивы
Строки
Управляющие операторы
Функции
Аргументы функции

ООП

Терминология
Определение классов
Константные методы
Статические члены
Наследование
Инкапсуляция
Полиморфизм
Инициализация и уничтожение объектов
this

прочее

шаблоны
макросы
динамическая память
исключения
rtti

Справочник по C++

Шаблоны

Шаблоны предназначены для быстрой генерации новых классов или функций имеющих одинаковый функционал. Иногда шаблоны классов и функций называют обобщенными или родовыми классами и функциями.

В качестве параметров шаблона выступают сами типы, и иногда значения указанных типов.

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

Методы классов также могут быть шаблонами. Методы шаблона класса уже являются шаблонами.

определение шаблонов

Шаблоны определяются ключевым словом, за которым в угловых скобках перечисляются параметры шаблона. Далее следует обычное определение объекта шаблона, т.е. функция, метод или класса. Если параметром шаблона является тип, то он определяется через ключевое слово typename. Параметры шаблона функции обязательно должны использоваться в описании аргументов.


#include<iostream>
#include<algorithm>
#include<stdexcept>
using namespace std;

template<typename T> 
void Swap(T &a, T &b) {
	T c=a;
	a=b;
	b=c;
}

template<typename T=double, int n=15> 
class Arrayn {
public:
	T data[n];

	Arrayn() {
		;
	}

	Arrayn(const T& val) {
		std::fill(data, data+n, val);
	}

	int size() {
		return n;
	}

	T& at(int ind);

	T& operator[](int ind) {
		if (ind>=n)
			throw std::out_of_range("incorrect index");
		return data[ind];
	}

	void operator =(const Arrayn &a) {
		std::copy(a.data, a.data+n, data);
	}

	// копирование массивов одного типа, но с разным числом эл.
	template<int k> void operator =(const Arrayn<T,k> &a) {
		std::copy(a.data, a.data+std::min(n, k), data);		
	}

	void fill(const T& val) {
		std::fill(data, data+n, val);
	}

};

template<typename T, int n> T& Arrayn<T, n>::at(int ind) {
	if (ind<0 || ind>=n)
		throw std::out_of_range("incorrect index");
	return data[ind];
}

использование шаблонов

Шаблон используется как обычная функция или класс. В последнем случае, после имени в угловых скобках указываются значения параметров шаблона, если они не заданы по умолчанию. Ниже приведен пример использования определенных выше шаблонов.


int main() {
	Arrayn<int,5> a1(4);
	Arrayn<int,5> a3(2);
	
	// для второго параметра шаблона используется 
	// значение по умолчанию
	Arrayn<int> a2(7); 
	
	a1=a2;
	for (int i=0; i<a1.size(); i++)
		cout<<a1[i]<<", ";
	cout<<endl;

	// используем функцию шаблон
	Swap(a1, a3);
	for (int i=0; i<a1.size(); i++)
		cout<<a1[i]<<", ";
	cout<<endl;

	// используем все параметры шаблона по умолчанию
	Arrayn<> dbls(3.14);
	for (int i=0; i<dbls.size(); i++)
		cout<<dbls[i]<<", ";
	cout<<endl;

	
	try {
		// обращение к несуществующему элементу
		cout<<a1[7]; 
	} catch(exception&e) {
		cout<<e.what()<<endl;
	}

	return 0;
}

замещение шаблонов

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


// частичное замещение, шаблон будет использоваться,
// если T является указателем на какой-нибудь тип
template<class T, int n> class Arrayn<T*,n> {
public:
	void outptr() {
	}
};

// полное замещение
template<>
class Arrayn<char, 255> {
public:
	void outchr() {
	}
};

int main() {

	Arrayn<int*> b;
	b.outptr();

	Arrayn<char,255> c;
	c.outchr();
}

Для шаблонов функций вместо замещения можно воспользоваться перегрузкой функций.

шаблон как параметр шаблона

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


template <typename T = Arrayn<int,20> >
...



У различных компиляторов могут быть свои особенности при работе с шаблонами.


Рейтинг@Mail.ru