Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

A.12.6. Объединения

Объединение (union) — это класс, в котором все члены расположены в одной и той же области памяти. В каждый момент времени объединение может содержать только один элемент, причем считывается только тот элемент объединения, который был записан последним. Рассмотрим пример.

union U {

int x;

double d;

}

U a;

a.x = 7;

int x1 = a.x; // OK

a.d = 7.7;

int x2 = a.x; //
Ой!

Правила согласованного чтения и записи членов объединения компилятором не проверяются. Мы вас предупредили.

A.13. Шаблоны

Шаблон (template) — это класс или функция, параметризованные набором типов и/или целыми числами.

template<class T>

class vector {

public:

// ...

int size const;

private:

int sz;

T* p;

};

template<class T>

int vector<T>::size const

{

return sz;

}

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

class
означает тип; его эквивалентной альтернативой является ключевое слово
typename
. Функция-член шаблонного класса по умолчанию является шаблонной функцией с тем же списком шаблонных аргументов, что и у класса.

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

template<typename T, int sz>

class Fixed_array {

public:

T a[sz];

// ...

int size const { return sz; };

};

Fixed_array<char,256> x1; // OK

int var = 226;

Fixed_array<char,var> x2; // ошибка: неконстантный шаблонный аргумент

A.13.1. Шаблонные аргументы

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

vector<int> v1; // OK

vector v2; // ошибка: пропущен шаблонный аргумент

vector<int,2> v3; // ошибка: слишком много шаблонных аргументов

vector<2> v4; // ошибка: ожидается тип шаблонного аргумента

Аргументы шаблонной функции обычно выводятся из ее аргументов.

template<class T>

T find(vector<T>& v, int i)

{

return v[i];

}

vector<int> v1;

vector<double> v2;

// ...

int x1 = find(v1,2); //
здесь тип T — это int

int x2 = find(v2,2); // здесь тип T — это double

Можно объявить шаблонную функцию, для которой невозможно вывести ее шаблонные аргументы. В этом случае мы должны конкретизировать шаблонные аргументы явно (точно так же, как для шаблонных классов). Рассмотрим пример.

template<class T, class U> T* make(const U& u) { return new T(u); }

int* pi = make<int>(2);

Node* pn = make<Node>(make_pair("hello",17));

Этот код работает, только если объект класса

Node
можно инициализировать объектом класса
pair<const char*,int>
(раздел Б.6.3). Из механизма явной конкретизации шаблонной функции можно исключать только замыкающие шаблонные аргументы (которые будут выведены).

A.13.2. Конкретизация шаблонов

Вариант шаблона для конкретного набора шаблонных аргументов называется специализацией (specialization). Процесс генерации специализаций на основе шаблона и набора аргументов называется конкретизацией шаблона (template instantiation). Как правило, эту задачу решает компилятор, но программист также может самостоятельно определить отдельную специализацию. Обычно это делается, когда общий шаблон для конкретного набора аргументов неприемлем. Рассмотрим пример.

template<class T> struct Compare { // общее сравнение

bool operator(const T& a,const T& b) const

{

return a<b;

}

};

template<> struct Compare<const char*> { // сравнение C-строк

bool operator(const char* a,const char* b) const

{

return strcmp(a,b)==0;

}

};

Compare<int> c2; // общее сравнение

Compare<const char*> c; // сравнение С-строк

bool b1 = c2(1,2); // общее сравнение

bool b2 = c("asd","dfg"); // сравнение С-строк

Аналогом специализации для функций является перегрузка.

template<class T> bool compare(const T& a,const T& b)

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9