Программирование >>  Разработка устойчивых систем 

1 ... 66 67 68 [ 69 ] 70 71 72 ... 196


templateo struct char traits<char> { typedef char char type; typedef int int type; typedef streamoff off type: typedef streampos pos type: typedef mbstate t state type:

static void assign(char type& cl, const char type& c2): static bool eqCconst char type& cl, const char type& c2): static bool lt(const char type& cl. const char type& c2): static int compareCconst char type* si,

const char type* s2, size t n): static size t length(const char type* s): static const char type* findCconst char type* s, size t n.

const char type& a): static char type* rnove(char type* si,

const char type* s2. size t n): static char type* copy(char type* si,

const char type* s2, size t n): static char type* assign(char type* s, size t n,

chartype a): static int type not eof(const int type& c): static char type to char type(const int type& c): static int type to int type(const char type& c): static bool eq int type(const int type& cl, const int type& c2):

static int type eofO:

Эти функции используются шаблоном класса basic string для выполнения операций с символами, общих для любых строк. Рассмотрим такое объявление переменной string:

std::string s:

На самом деле s объявляется следующим образом (благодаря аргументам по

умолчанию в спецификации basic.string):

std::basic string<char. std::char traits<char>, std: :anocator<char> > s:

Отделение характеристик символов от шаблона bask.string позволяет предоставить нестандартный класс характеристик для замены std::char traits. Следующий пример демонстрирует замечательную гибкость такого решения:

: C05:BearCorner.h #ifndef BEARCORNER H #define BEARCORNER H linclude <iostream> using std::ostream:

Классы угощения (характеристики гостей):

class Milk {

public:

friend ostreamS operator (ostreaiTi& os, const MilkS) { return OS Milk ;

class CondensedMilk { public: friend ostream&

operator (ostream& os, const CondensedMilk&) {



return OS CondensedMilk :

class Honey { public:

friend ostreamS operator (ostreani& os. const HoneyS) { return OS Honey :

class Cookies { public:

friend ostreamS operator (ostream& os. const CookiesS) { return OS Cookies :

Классы гостей: class Bear { public:

friend ostreamS operator (ostream& os. const BearS) { return OS Theodore :

class Boy { public:

friend ostreamS operator (ostream& os. const Boy&) { return OS Patrick :

Основной шаблон характеристик (пустой - может использоваться для хранения базовых типов) tempiate<class Guest> class GuestTraits:

Специализации характеристик для типов гостей templateo class GuestTraits<Bear> { public:

typedef CondensedMilk beverage type: typedef Honey snack type:

templateo

class GuestTraits<Boy> { public:

typedef Milk beverage type: typedef Cookies snack type:

#endif BEARCORNERJ

: C05:BearCorner.h

Использование классов характеристик

linclude <iostream>

linclude BearCorner.h

using namespace std:

Нестандартный класс характеристик



class MixedUpTraits { public:

typedef Milk beverage type: typedef Honey snack type:

Шаблон гостя (использует класс характеристик) temp1ate< class Guest, class traits = GuestTraits<Guest> > class BearCorner { Guest theGuest:

typedef typename traits::beverage type beverage type: typedef typename traits::snack type snack type: beverage type bev: snack type snack: public:

BearCorner(const GuestS g) : theGuest(g). {} void entertainO { cout Entertaining theGuest

serving bev

and snack endl:

int mainO { Boy cr:

BearCorner<Boy> pcKcr): pcl.entertainO: Bear pb:

BearCorner<Bear> pc2(pb): pc2.entertain():

BearCorner<Bear. MixedUpTraits> pc3(pb): pcS.entertainO: } /:-

В этой программе экземплярам классов гостей Boy и Bear назначаются классы угощения по вкусу. Для класса Boy это классы Milk и Cookies, и для класса Bear - CondensedMilk и Honey. Гости связываются с угощением через специализации основного (пустого) шаблона класса характеристик. Аргументы BearCorner по умолчанию обеспечивают стандартное меню , однако такое поведение можно переопределить, как было сделано ранее с классом MixedUpTraits. Результат выполнения программы выглядит так:

Entertaining Patrick serving Milk and Cookies Entertaining Theodore serving Condensed Milk and Cookies Entertaining Theodore serving Milk and Honey

Характеристики обладают двумя важными преимуществами. Во-первых, связывание объектов с атрибутами или функциональностью делает программу более гибкой и упрощает ее расширение. Во-вторых, списки параметров шаблонов остаются небольшими и удобочитаемыми. Если бы с каждым гостем ассоциировалось 30 типов, было бы крайне неудобно указывать все 30 аргументов при каждом объявлении BearCorner. Выделение типов в отдельный класс характеристик существенно упрощает ситуацию.

Как было показано в главе 4, характеристики также применяются в реализациях потоков данных и локальных контекстов. Пример характеристик итераторов используется в заголовочном файле PrintSequence.h главы 6.



1 ... 66 67 68 [ 69 ] 70 71 72 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика