«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как хранить разнородные объекты в контейнерах C++: boost::any или пользовательская реализация?

Как хранить разнородные объекты в контейнерах C++: boost::any или пользовательская реализация?

Опубликовано 8 ноября 2024 г.
Просматривать:404

 How to Store Heterogeneous Objects in C   Containers: boost::any or Custom Implementation?

Хранение разнородных объектов в контейнерах C

Контейнерам C обычно требуются однородные элементы, то есть они могут хранить только объекты одного типа. Однако бывают ситуации, когда вам может понадобиться контейнер, способный вместить разные типы данных. В этой статье рассказывается, как добиться этого с помощью библиотеки boost::any и специального подхода.

Использование boost::any

boost::any — это класс-шаблон. который может содержать любой тип C. Сохраняя экземпляры boost::any в контейнере, вы можете получить разнородную коллекцию объектов. Этот подход рекомендуется из-за его надежности и возможности обработки крайних случаев.

Пользовательская реализация

Если вы предпочитаете более ручной подход, вы можете создать собственную структуру или объединение, которое объединяет элементы всех ожидаемых типов вместе с индикатором для указания активного типа.

Структура Подход:

struct HeterogeneousContainer {
  int i;
  std::string s;
  double d;
  int type; // 0 for int, 1 for string, 2 for double
};

Union Approach (используйте с осторожностью):

union HeterogeneousContainer {
  int i;
  std::string s;
  double d;
};

Однако у этого подхода есть ограничения и потенциальные ловушки, такие как:

  • Объединения допускают одновременно только одного активного члена.
  • Чтение неактивного члена может привести к неопределенному поведению.
  • Требуется осторожное обращение, чтобы убедиться, что указан правильный тип и доступ.

Вывод

Когда возникает необходимость хранить разнородные объекты в контейнере C, рассмотрите возможность использования библиотеки boost::any из соображений ее безопасности и эффективности. . При желании можно создать собственную реализацию с использованием структуры или объединения, но помните об их ограничениях.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3