• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Перегрузка функций. Шаблонный клас. Прошу помощи.

p-a-h-a

Member
Здравствуйте. Создаю библиотеку для хранения практически любых типов данных в файле LittleFS включая STL контейнеры (std::vector, std::list, std::unordered_map и т.д.)
В связи с множественными типами переменных и контейнеров наплодилось много перегрузок методов, которые вызывают один и тот же метод. Прошу помощи в упрощении.
Файл библиотеки находится по ссылке.

Запись в файла примитивов (int, byte ...) обрабатывает метод:
Код:
  template <typename T>
  bool write(const T &data) const;
Все контейнеры STL записывает в файл метод:
C++:
  template <typename T>
  bool writeContainer(const T &container) const;
Но он выглядит так же как и для примитивов. Поэтому для каждого контейнера прописана перегрузка метода write, вызывающая метод writeContainer:
C++:
  template <typename T>
  bool write(const std::vector<T> &container);
  template <typename T>
  bool write(const std::list<T> &container);
  template <typename T>
  bool write(const std::deque<T> &container);
  template <typename T>
  bool write(const std::set<T> &container);//...........
Контейнеров много, это часть перегрузки метода принимающего их. Подобная ситуация и с чтением из файла.
Вопрос как избавиться от множества подобных перегрузок метода write?

Вопрос № 2. Поскольку клас "StorageManager" шаблонный, реализация всех методов описана в заголовочном файле h. Нужно ли делать отдельный cpp файл реализации или оставить все в хэдере? Если нужно, то как это делается с шаблонными класами, может подскажите пример стандартной библиотеки чтоб подсмотреть и где об этом почитать. Спасибо.
PS: делаю эту библиотеку т.к. хочу дальше изучать С++ и практикуюсь со стандартной библиотекой STL.
 

p-a-h-a

Member
Дополню: Хочу понять как можно отличить тип входящих данных и разделить его на контейнеры stl и все остальное.
 

p-a-h-a

Member
Изучил тему вопроса глубже. Все получилось. Собственно результат библиотеки, которая сохраняет в ФС любые типы данных включая STL контейнеры vector, map и т.д., отличает тип входящих данных (по методам в этих данных) и в зависимости от типа выполняет разные алгоритмы. Тут мне стоило почитать про "специализацию шаблона класса", и проверку имеет ли объект определенные методы.
Также отвечу на свой вопрос по реализации методов в шаблонном классе: Реализация методов делается в заголовочном файле. больше знать не нужно.

Собственно ссылка на результат: StorageManager.h и в целом на проект с примерами.
 
Сверху Снизу