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

Как добиться полиморфизма с помощью методов виртуальных шаблонов в C++?

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

How can you achieve polymorphism with virtual template methods in C  ?

Метод виртуального шаблона C

В C может быть сложно объединить статический полиморфизм времени (шаблоны) с полиморфизмом времени выполнения. Это очевидно в следующем абстрактном классе:

class AbstractComputation {
    public:
        template  virtual void setData(std::string id, T data);
        template  virtual T getData(std::string id);
};

Этот класс предназначен для установки и получения данных указанного типа на основе уникального идентификатора. Однако проблема возникает при попытке вызвать универсальную функцию setData с определенным типом, например setData("foodouble", data).

Язык запрещает эту конструкцию, поскольку компилятору пришлось бы динамически отправлять бесконечное количество возможных экземпляров шаблона. Для решения этой проблемы возможно несколько подходов:

Удаление статического полиморфизма:

  • Устраните статический полиморфизм, введя отдельный тип для хранения значения ключа. отображения. Затем шаблон может решить эту проблему на базовом уровне без необходимости полиморфизма:
class AbstractComputation {
public:
   template 
   void setData( std::string const & id, T value ) {
      m_store.setData( id, value );
   }
   template 
   T getData( std::string const & id ) const {
      return m_store.getData( id );
   }
protected:
   ValueStore m_store;
};

Удаление динамического полиморфизма:

  • Сохранить полиморфизм времени выполнения, но устранить статический полиморфизм путем стирания типа:
  • Использовать boost::any, который обеспечивает стирание типов для хранения данных любого типа:
class AbstractComputation {
public:
   template 
   void setData( std::string const & id, T value ) {
      setDataImpl( id, boost::any( value ) );
   }
   template 
   T getData( std::string const & id ) const {
      boost::any res = getDataImpl( id );
      return boost::any_cast( res );
   }
protected:
   virtual void setDataImpl( std::string const & id, boost::any const & value ) = 0;
   virtual boost::any getDataImpl( std::string const & id ) const = 0;
};
Последний учебник Более>

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

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

Copyright© 2022 湘ICP备2022001581号-3