Проектирование класса EventSystem на C++ для работы с различными типами контейнеровC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Проектирование класса EventSystem на C++ для работы с различными типами контейнеров

Сообщение Anonymous »


Я занимаюсь разработкой класса 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 и конкретными потребностями сложных классов контейнеров.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»