Списки типів Нікітін Олексій. Навіщо потрібні списки типів? Розглянемо шаблон Abstract Factory. class WidgetFactory { public: virtual Window* createWindow()

Slides:



Advertisements
Similar presentations
Презентація на тему: ЕЛЕМЕНТИ ТЕОРІЇ ВИПАДКОВИХ ПРОЦЕСІВ ТА ЇХ ВИКОРИСТАННЯ ДЛЯ РОЗВ’ЯЗУВАННЯ ПРИКЛАДНИХ ЗАДАЧ.
Advertisements

Користування бібліотекою та довідково-бібліографічним апаратом Електронний каталог Наукової бібліотеки НаУКМА (ІБС ALEPH500) Баньковська Ірина 14 жовтня.
10 КЛАС ЗА ПІДРУЧНИКОМ «ІНФОРМАТИКА. 10 КЛАС» Й.Я. РИВКІНДА, Т.І. ЛИСЕНКО, Л.А. ЧЕРНІКОВОЇ, В.В. ШАКОТЬКО Вивчаємо інформатику СЗОШ № 8 м.Хмельницького.
Multimedia Presentation "What Is a Computer?"
Кротова І.В., методист Центру аналізу та прогнозування розвитку освіти Всеукраїнська українознавча гра «Соняшник»
Гідросфера,її основні частини Січкар.О.Ю Методичні рекомендації.
Застосування похідної. (Матеріали для самостійного вивчення теми).
Електронна пошта – сервіс
М УЛЬТИМЕДІЙНІ ПРЕЗЕНТАЦІЇ Мультимедійні технології С ТВОРЕННЯ КЛІПІВ.
Симетрія відносно точки та прямої
"Тіла обертання та їх об’єми "
Пилипенко Олена Володимирівна,
1980р. – видано Червону книгу України.
Відділ освіти Кам’янської райдержадміністрації Грушківської загальноосвітньої школи І-ІІІступенів Презентація до уроку з природознавства в 6 класі на тему:
„Задачі на спільну роботу в 3 класі” Литвиненко Л. В.
Створення та форматування інформаційного вмісту презентації
Презентація на тему: Органічні речовини і здоров'я людини
Створення макросів в автоматичному режимі
Шаблони документів і робота з ними
н.р р Про проведення державної підсумкової атестації в 9 та в 11 класах. Здача звітів. 2. Обмін досвідом щодо проведення.
Розв’язування задач. 1. Розв’яжiть рiвняння: б) в) г) д) Виконання усних вправ а)
Виконали : учні 9 класу Подорожненської ЗШ І – ІІІ ступенів Кучер С. Зацепа В. Корольов О. Соловей В.
Вбудовування та зв’язування файлів. Веб-публікація документів
1. Планарія – паразит, що живиться кров’ю риб. 2. Травна система Стьожкових червів складається з ротової порожнини і розгалуженого кишечника 3. Проміжний.
Тема: Відносна густина газів. Обчислення відносної густини.
Основні поняття та засоби комп'ютерної графіки
Робота з Windows Файл, папка.
Пpавила техніки безпеки під час pоботи на комп’ютеpі. Поняття по інформацію. Повідомлення. Способи подання і кодування повідомлень. Двійкове кодування.
Кристалічні ґратки. Залежність фізичних властивостей речовини від типів кристалічних ґраток.
Створення й оформлення блогу
Вимірювання та вимірювальні прилади Лабораторна робота
Основи векторної графіки
Бородянська спеціалізована школа - загальноосвітній заклад І-ІІІ ступенів №1 КВІТНИК Підготувала старший вчитель трудового навчання Трохименко Ніна Миколаївна.
Урок № 63.
Електронні таблиці 3.7. Діаграми в Excel «Не бійся, що не знаєш – бійся, що не навчишся». (Китайська мудрість)
Урок № 2 Розчин та його компоненти: розчинник, розчинена речовина. Вода як розчинник. Будова молекули води, поняття про водневий зв’язок. Фізико-хімічна.
Електронні таблиці MS Excel.
Тестове завдання № 7 1. Розв’яжіть рівняння 21 0,4
Комп'ютерні презентації
Найрозумніший математик 6 класу
Автори навчально - методичного комплекту : М. С. Вашуленко, доктор педагогічних наук, професор, дійсний член НАПН України С. Г. Дубовик, кандидат педагогічних.
година правової абетки у 5 класі
Повідомлення на тему: Методи астрономічних спостережень Робота
Як держава захищає права дитини в сім'ї
ОПЕРАЦІЙНА СИСТЕМА Windows 
Сходинки до інформатики. 2 клас за новою державною програмою
Google App Engine for Java Google App Engine2 Google App Engine (GAE) – це інфраструктура хмарних обчислень, яка орієнтована на підтримку веб-додатків.
МАТЕМАТИКА 1 клас Уведення поняття «літр» Гапонько Тетяна Миколаївна.
Платформа Microsoft Azure 2014 (До 2014 року платформа мала назву Windows Azure)
Аналітична хімія. Хімічний аналіз.
Web MVC фреймворки WebWork та Struts (Курс “Інформаційні технології”)
There is/There are Граматичний практикум. Що означає? Коли використовується? Конструкція “there is/there are” означає «є, знаходиться». Ми використовуємо.
До використання COM- об’єктів у Visual Studio (C#)
Нехай u — вершина, від якої шукаються інші, V — множина вершин графа, di — відстань від u до вершини i,, w(i, j) — вага «ребра» (i, j). 1. Множина.
Розробка Web-проектів із використанням Struts Framework 2008.
Мій педагогічний принцип:
Web-framework Tapestry 2008 (Курс “Інформаційні технології”)
Навчальний елемент Робота з меню у програмі Windows'95 Назва: Оператор комп’ютерного набору Професія: UA002 Код:
ITERATOR Патерн поведінки Доповідач: Пропой Ярослав Рецензент: Мельниченко Владислав 0/40 NEXTSTART.
Горобей Тетяна Павлівна, учитель математики Фастівського ліцею-інтернату.
Зазуляк Тетяни Означення чотирикутника  Чотирикутником називається фігура, що складається з чотирьох точок і чотирьох відрізків, які послідовно їх з’єднують.
Ламінування та способи ламінування
Методичні поради щодо підготовки до ЗНО-2015 з української мови і літератури.
“Архітектура - це застигла в камені музика” В.Гюго.
D H P T K E Підготувала учениця 8 класу Гайда Вікторія.
Технологія виконання швів «козлик» та «оксамитовий»
Активність радіонуклідів
Оперативна хірургія ділянок шиї Проф. М. С. Гнатюк.
Паралелепіпед Геометрія. Зібратися разом – це початок. Триматися разом – це прогрес. Працювати разом – це успіх. Г. Форд.
2015. Два рiвні складності сертифікаційної роботи (тесту) Абітурієнти складали тест ЗНО з математики двох рівнів складності – базового і поглибленого,
Presentation transcript:

Списки типів Нікітін Олексій

Навіщо потрібні списки типів? Розглянемо шаблон Abstract Factory. class WidgetFactory { public: virtual Window* createWindow() = 0; virtual Button* createButton() = 0; virtual ScrollBar* createScrollBar() = 0; }

1) Така фабрика може створювати лише об’єкти типу Widget, Button, ScrollBar 2) Функціями-членами класу WidgetFactory неможливо вільно маніпулювати. Розглянемо такий код template T* makeRedWidget(WidgetFactory& factory) { T* pw = factory.createT();//неможливо pw->setColor(RED); return pw; }

Хотілося б мати Фабрику, якій можна вказати – які саме об’єкти вона повинна створювати. Наприклад typedef AbstractFactory WidgetFactory. Але шаблони не можуть мати змінну кількість параметрів.

template T* makeRedWidget(WidgetFactory& factory) { T* pw = factory.create (); pw->setColor(RED); return pw; } Але в С++ неможливо створити шаблонну віртуальну функцію.

Визначення списків типів Список, який складається з двох типів. template struct Typelist { typedef T head; typedef U tail; };

Список, який складається з трьох типів. typedef Typelist > Charlist; Також потрібен нульовий тип списку, який не містить жодного типу, нехай це буде класс NullType. Також нехай NullType буде маркером кінця списку.

Список, який містить один тип typedef Typelist OneTypeList; Два типи typedef Typelist > TwoTypeList;

За допомогою макросів можна покращити зовнішній вигляд визначення списків типів. #define TYPELIST_1(T1) Typelist #define TYPELIST_2(T1, T2) Typelist #define TYPELIST_3(T1, T2, T3) Typelist …..

Визначення списку з чотирьох типів typedef TYPELIST_4(char, short, int, long int) MyTypeList; еквівалентно Typelist<char, Typelist<short, Typelist<int, Typelist > > >

Обрахування дліни списку template struct Length; template <> struct Length { enum { value = 0 }; } template struct Length > { enum { value = 1 + Length ::value }; }

Індексований доступ template struct TypeAt; Надаємо список типів TList та index. Отримуємо оголошення типу, який стоїть в списку за певним індексом.

template struct TypeAt, 0> { typedef Head Result; } template struct TypeAt, i> { typedef typename TypeAt ::Result Result; };

Пошук індекса типа template struct IndexOf; template struct IndexOf { enum { value = -1; }; }

template struct IndexOf, T> { enum { value = 0 }; }; template struct IndexOf, T> { private: enum { temp = IndexOf ::value }; public: enum { value = (temp == -1 ? -1 : 1 + temp) }; };

Додавання елемента template struct Append; template <> struct Append { typedef NullType Result; }; template struct Append { typedef TYPELIST_1(T) Result; };

template struct Append > { typedef Typelist Result; } template struct Append, T> { typedef Typelist ::Result> Result; };

Видалення елемента template struct Erase; template struct Erase { typedef NullType Result; }

template struct Erase, T> { typedef Tail Result; //typedef typename EraseAll ::Result result; }; template struct Erase, T> { typedef Typelist<Head, typename Erase ::Result> Result; };

Видалення дублікатів template struct NoDuplicates; template <> struct NoDuplicates { typedef NullType Result; }; template struct NoDuplicates > { private: typedef typename NoDuplicates ::Result L1; typedef typename Erase ::Result L2; public: typedef Typelist Result; };

Заміна елемента template struct Replace; template struct Replace { typedef NullType Result; };

template struct Replace, T, U> { typedef Typelist Result; //typedef Typelist<U, typename Replace ::Result > Result; }; template struct Replace, T, U> { typedef Typelist<Head, typename Replace ::Result> Result; };

Частково впорядковані списки типів Потрібно в певному списку переставити типи так, щоб нащадки були попереду. Еквівалентно обходу ієрархії класів знизу уверх.

Потрібні: #define SUPERSUBCLASS(T, U) SuperSubclass ::value який має значення True, якщо класс U є нащадком класу T. Select – використовує отримане boolean значення. template struct Select { typedef T Result; }; template struct Select { typedef U Result; };

MostDerived Пошук нащадка самого нижнього рівня template struct MostDerived; template struct MostDerived { typedef T Result; };

template struct MostDerived, T> { private: typedef typename MostDerived ::Result Candidate; public: typedef typename Select <SUPERSUBCLASS(Candidate, Head), Head, Candidate>::Result Result; };

DerivedToFront template struct DerivedToFront; template<> struct DerivedToFront { typedef NullType Result; };

template struct DerivedToFront > { private: typedef typename MostDerived ::Result TheMostDerived; typedef typename Replace ::Result Temp; typedef typename DerivedToFront ::Result L; public: typedef Typelist Result; };

Генерація розподілених ієрархій template struct Unit { T value_; } template class Unit> class GenScatterHierarchy; Процес конкретизації класса GenScatterHierarchy закінчується спадкуванням класу Unit, конкретизованого кожним типом зі списку типів

typedef GenScatterHierarchy WidgetInfo; Порожній список: template class Unit> class GenScatterHierarchy { };

Атомарний тип ( не список типів) template class Unit> class GenScatterHierarchy : public Unit { typedef Unit LeftBase; };

Список типів: template class Unit> class GenScatterHierarchy, Unit> : public GenScatterHierarchy, public GenScatterHierarchy { public: typedef GenScatterHierarchy LeftBase; typedef GenScatterHierarchy RightBase; };

Звертання до атрибуту value_ класу Holder через екземпляр класу WidgetInfo. WidgetInfo obj; string name = (static_cast &>(obj)).value_;

Генерація лінійних ієрархій template class EventHandler { public: virtual void OnEvent(const T&, int eventId) = 0; virtual void ~EventHandler() { } };

typedef GenScatterHierarchy < TYPELIST_3(Window, Button, ScrollBar), EventHandler > WidgetEventHandler; Через множинне спадкування клас WidgetEventHandler містить три вказівника на віртуальні таблиці, по одній для кожної конкретизації класу EventHandler.

У випадку звичайного спадкування клас WidgetEventHandler може мати лише один вказівник на віртуальну таблицю

Рішення template < class TList, template class Unit, class Root = EmptyType > class GenLinearHierarchy;

template < class T1, class T2, template class Unit, class Root > class GenLinearHierarchy, Unit, Root> : public Unit > { };

template < class T, template class Unit, class Root > class GenLinearHierarchy : public Unit { };

Приклад використання template class EventHandler: public Base { public: virtual void OnEvent(T& obj, int eventId); }; typedef GenLinearHierarchy < TYPELIST_3(Window, Button, ScrollBar), EventHandler > MyEventHandler.

Дякую за увагу