Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
69
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

18.10 Форматирование в памяти

Библиотека потоков содержит 3 класса, предназначенных для ввода и вывода в память.

Класс istrstream обеспечивает интерфейс для форматных извлечений из памяти. Объект этого класса можно создать, задавая буфер и его размер

istrstream(const char *buf, int n);

Указание размера не требуется, если буфер оканчивается нулевым символом:

istrstream(const char *);

Класс ostrstream обеспечивает интерфейс для форматных помещений в память. Объект этого класса можно создать, задавая n-байтный буфер:

ostrstream(const char *buf, int n, int mode=ios::out);

Поток ostrstream можно создать в режиме добавления, установив бит ios::ate или ios::app в третьем параметре. Это позволит в качестве буфера передавать ограниченную нулем строку, и пополнение буфера начнется с позиции нулевого символа.

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

ostrstream( );

Класс strstream поддерживает оба типа операций.

18.11 Дополнительные возможности ostrstream

char* ostrstream::str( ) — возвращает указатель на буфер потока и “замораживает” его. В дальнейшем следует или удалить буфер из динамической памяти или “разморозить” его функцией strstreambuf::freeze(int), например, так:

oss->rdbuf( )->freeze(0)

int ostrstream::pcount( ) — возвращает текущее число байт, записанных в буфер.

З а м е ч а н и е. Работая с объектами ostrstream, необходимо в явном виде добавить к потоку символ \0.

19 Шаблоны

Шаблоны — это обобщенные определения классов и функций. На основе этих определений компилятор строит конкретные классы и функции. Шаблоны также называют параметризованными типами.

19.1 Шаблоны функций

П р и м е р. Шаблон функции поиска максимума

template < class T>

T maximum(T a, T b) { return a>b ? a : b; }

void main(){

int m = maximum(3,5);

float f = maximum(3.5,5.5);

}

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

1) class имя — параметр, обозначающий тип;

2) тип имя — параметр, обозначающий константу.

Шаблон функции может иметь прототип. В качестве примера приведем прототип функции сортировки массива произвольного типа.

template <class T> void sort (T array[], size_t size);

Шаблон можно применять и к классам, определенным пользователем. Например, шаблон maximum можно применять к любым классам, лишь бы для них была определена операция сравнения “>”.

19.2 Перегрузка и специализация шаблонов

Как и обычные функции, шаблоны могут быть перегружены.

Специализированная функция шаблона — это обычная функция, имя которой совпадает с именем шаблона. Такие функции определяются для случаев, когда обобщенный шаблон не годится или не эффективен для некоторых типов данных. Например, шаблон maximum не годится для строк, поэтому к шаблону добавим:

char* maximum(char* a, char* b){

return strcmp(a,b)>0 ? a : b;

}

Когда компилятор встречает обращение к функции, разрешение ссылки выполняется по следующему алгоритму:

1) найти не шаблонную функцию, параметры которой соответствуют вызову;

2) если функция не найдена, найти шаблон, по которому можно сгенерировать функцию с точным соответствием параметров;

3) если шаблон не найден, снова рассмотреть обычные функции на предмет преобразования типов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]