![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Есть библиотека, которая возвращает разнородные данные в одном буфере. Каждый эелемент содержит идентификатор типа, индекс типа int и далее, в зависимости от типа разные данные. К примеру, там могут содержаться такие данные:
и так далее мне нужно с этими данными работать единообразно, и желательно, иметь возможность работать с контейнером как со стандартным, используя стандартные алгоритмы к примеру мне может понадобиться найти элементы с максимальной меткой времени, но только имеющие тип A или C, и так далее... Ваши советы? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Lazin
У тебя определены эти классы - так? Что если их унаследовать от одного класса типа
и убрать index из всех классов (я так понял это и есть идентификатор типа). Хранить контейнер (к примеру лист) базовых обьектов, переписать алокатор чтобы не выделял память а брал обьект из буфера. Только вот при работе с ним придется cast делать. Но тут тоже можно обойтись. Если все index известны компайл-тайм можно использовать Typelist из Loki, но это только если все на компайл тайм писать.. я не знаю так получится или нет ибо не знаком со всей задачей. Это сообщение отредактировал(а) azesmcar - 29.4.2009, 19:22 |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
А что, если определить свой класс-итератор, который будет пропускать невалидные типы?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
имхо, слишком мало исходной информации, чтоб представить картину и пытаться найти подходящее решение ...
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
можно сделать что-то std::vector<boost::any>
или более специализированное: сделать базовый класс с чисто виртуальными функциями GetCategory, GetIndex унаследовать от него шаблонный класс, который уже будет осуществлять доступ к конкретным структурам, сделать фабрику и натравить весь этот зоопарк на входной буфер - он его распарсит и даст доступ, спускаться к конкретному типу можно будет по dynamic_cast -------------------- qqq |
|||
|
||||
| Lazin |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Вот пример
сами структуры не важны, это просто упрощенный пример итак, буфер содержит данные разных категорий - A, B и C данные разных категорий содержат как общие поля (id, index), так и специфические для данной категории(value, time) мне нужно по разному обрабатывать разные подмножества этих данных, к примеру найти среди данных категории А, первое, у которого value больше заданого значения, либо найти среди данных всех категорий те, у которых метка времени меньше заданой (метки времени данных разных категорий нужно привести к одному типу) все это хардкодить не хочется Добавлено через 5 минут и 55 секунд
это детали реализации, суть не в этом нет, данные должны храниться так, как они пришли, потому-что их там очень много, их нужно интерпритировать по мере необходимости
тепло нельзя, слишком ресурсоемко то-же самое, данные не должны меняться, их нужно просто фильтровать, но только условие фильтрации не должно быть задано жестко Добавлено через 11 минут и 14 секунд пока что я думаю сделать как нибудь так
единственное что я пока не понимаю, это как задавать параметры фильтрации буфера... |
||||||||
|
|||||||||
| sdukshis |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 23.3.2009 Репутация: нет Всего: 1 |
Использовать паттерн адаптер (иногда называют обёркта).
Суть примерно следующая: Создаётся новая иерархия классов с одним базовым классом и потомками (по одному потомку на обрабатываемый тип) В базовом классе с использованием виртуальных функций задается интерфейс для необходимого функционала (то что Вам необходимо) Каждый из потомков переопределяет эти интерфейсы согласно типу, который он инкапсулирует (например сохраняя указатель на него). Хранить адаптеры можно путём приведения к указателю на базовый класс и используя, например list<BaseAdapter*> Создавать с использованием фабричного метод (фактические та же инструкция switch только надо возвращать return new ...) Если не очень понятно, то скажите. Тогда проиллюстрирую это кодом. P.S. Если интересует литература: Гамма, Хелм, Джонсон, Влиссидес - "Приёмы ОО проектирования. Паттерны проектирования" |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
поэксперементировал с одной идейкой, вот код, правда ужасно грязный, но сейчас нет времени его доводить до ума, но принцип я думаю виден.
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
все очень понятно, но есть один нюанс представь, что их там миллионы, ты предлагаешь для каждого из них создать новый объект в куче и к тому-же повысить уровень косвенности при обращении(вызов виртуальной ф-ии, доступ к объекту через указатель на базовый класс)? no way Добавлено через 4 минуты и 41 секунду
ага |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ну тогда можно сам вектор не создавать, а просто сделать интерфейс, как у него, точнее, даже подмножество интерфейса: 1. инициализировать 2. получить указатель на текущий объект 3. перейти к следующему 4. проверить на окончание -------------------- qqq |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Lazin
ну тогда остается как вижу один вариант, написать свой, стл совместимый контейнер, со своими итераторами (думаю тут подойдет forward iterator), передавать в конструкторе буфер и количество элементов в нем. а дальше как с обычным
чтобы не писать этот код везде написать предикаты. Еще как вариант. Можно switch вообще убрать, но тогда придется работать с базовым типом (если он есть) |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |