Проектирование класса EventSystem на C++ для работы с различными типами контейнеров ⇐ C++
Проектирование класса EventSystem на C++ для работы с различными типами контейнеров
Я занимаюсь разработкой класса EventSystem на C++14 с целью включить в него шаблон наблюдателя. Ключевым аспектом моего проекта является обеспечение совместимости с различными типами контейнеров, такими как std::vector, std::map и другими, тем самым повышая его гибкость и расширяемость. Моя стратегия предполагает использование шаблонов для достижения этой цели.
Вот схема моей текущей реализации:
#include #include #include шаблон класс EventSystem: общедоступный субъект { публика: // static_assert("ContainerType должен быть подтипом IContainer"); виртуальный ~ EventSystem() = по умолчанию; частный: КонтейнерТип мКонтейнер; void Attach(const InfoType& ObserverID, ObserverType& Observer) переопределить { mContainer.Add(observerID, наблюдатель); } void Detach(const InfoType& ObserverID) переопределить { mContainer.Remove(observerID); } }; шаблон класс IContainer { публика: виртуальная пустота Add(const T& item) = 0; // Добавляет элемент виртуальная пустота Remove (const T& item) = 0; // Удаляем элемент, если он существует в контейнере виртуальный ~IContainer() = по умолчанию; }; шаблон Контейнер класса: общедоступный IContainer { публика: void Add(const T& item) переопределить { контейнер.Добавить(элемент); } void Remove(const T& item) переопределить { контейнер.Удалить(элемент); } частный: Контейнер ContainerType; }; шаблон класс ВекторКонтейнер { публика: void Add(const T& item) { vect.push_back(предмет); } void Remove (const T& item) { // Предполагаем, что T имеет допустимое сравнение на равенство auto it = std::remove(vect.begin(), vect.end(), item); vect.erase(it, vect.end()); } частный: std::vector vect; }; шаблон класс MapContainer { публика: void Add(const std::pair& keyValue) { контейнер.вставка(ключевое значение); } void Add (константный ключ и ключ, константное значение и значение) { контейнер [ключ] = значение; } void Remove(const std::pair& keyValue) { Container.erase(keyValue.first); } частный: std::map контейнер; };
Основная проблема, с которой я столкнулся, связана с реализацией интерфейса IContainer. Требование состоит в том, чтобы определить его с использованием одного параметра шаблона, при этом допуская адаптацию этого интерфейса в классах контейнеров, для которых может потребоваться несколько параметров шаблона. Этот сценарий особенно актуален для таких классов, как MapContainer, которым требуется два параметра. Чтобы решить эту проблему, я рассматриваю возможность применения композиционного подхода.
Цель моего вопроса — получить совет по структурированию интерфейса IContainer и его реализации в различных типах контейнеров, особенно в тех, которые требуют нескольких параметров шаблона. Мы будем очень признательны за идеи по созданию дизайна, который поддерживает баланс между универсальностью интерфейса IContainer и конкретными потребностями сложных классов контейнеров.
Я занимаюсь разработкой класса EventSystem на C++14 с целью включить в него шаблон наблюдателя. Ключевым аспектом моего проекта является обеспечение совместимости с различными типами контейнеров, такими как std::vector, std::map и другими, тем самым повышая его гибкость и расширяемость. Моя стратегия предполагает использование шаблонов для достижения этой цели.
Вот схема моей текущей реализации:
#include #include #include шаблон класс EventSystem: общедоступный субъект { публика: // static_assert("ContainerType должен быть подтипом IContainer"); виртуальный ~ EventSystem() = по умолчанию; частный: КонтейнерТип мКонтейнер; void Attach(const InfoType& ObserverID, ObserverType& Observer) переопределить { mContainer.Add(observerID, наблюдатель); } void Detach(const InfoType& ObserverID) переопределить { mContainer.Remove(observerID); } }; шаблон класс IContainer { публика: виртуальная пустота Add(const T& item) = 0; // Добавляет элемент виртуальная пустота Remove (const T& item) = 0; // Удаляем элемент, если он существует в контейнере виртуальный ~IContainer() = по умолчанию; }; шаблон Контейнер класса: общедоступный IContainer { публика: void Add(const T& item) переопределить { контейнер.Добавить(элемент); } void Remove(const T& item) переопределить { контейнер.Удалить(элемент); } частный: Контейнер ContainerType; }; шаблон класс ВекторКонтейнер { публика: void Add(const T& item) { vect.push_back(предмет); } void Remove (const T& item) { // Предполагаем, что T имеет допустимое сравнение на равенство auto it = std::remove(vect.begin(), vect.end(), item); vect.erase(it, vect.end()); } частный: std::vector vect; }; шаблон класс MapContainer { публика: void Add(const std::pair& keyValue) { контейнер.вставка(ключевое значение); } void Add (константный ключ и ключ, константное значение и значение) { контейнер [ключ] = значение; } void Remove(const std::pair& keyValue) { Container.erase(keyValue.first); } частный: std::map контейнер; };
Основная проблема, с которой я столкнулся, связана с реализацией интерфейса IContainer. Требование состоит в том, чтобы определить его с использованием одного параметра шаблона, при этом допуская адаптацию этого интерфейса в классах контейнеров, для которых может потребоваться несколько параметров шаблона. Этот сценарий особенно актуален для таких классов, как MapContainer, которым требуется два параметра. Чтобы решить эту проблему, я рассматриваю возможность применения композиционного подхода.
Цель моего вопроса — получить совет по структурированию интерфейса IContainer и его реализации в различных типах контейнеров, особенно в тех, которые требуют нескольких параметров шаблона. Мы будем очень признательны за идеи по созданию дизайна, который поддерживает баланс между универсальностью интерфейса IContainer и конкретными потребностями сложных классов контейнеров.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Проектирование системы уведомлений в базе данных с различными типами уведомлений
Anonymous » » в форуме MySql - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Анализ больших объемов данных JSON с несколькими различными типами объектов
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-