|
Программирование >> Разработка устойчивых систем
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.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |