Метод виртуального шаблона C
В C может быть сложно объединить статический полиморфизм времени (шаблоны) с полиморфизмом времени выполнения. Это очевидно в следующем абстрактном классе:
class AbstractComputation {
public:
template virtual void setData(std::string id, T data);
template virtual T getData(std::string id);
};
Этот класс предназначен для установки и получения данных указанного типа на основе уникального идентификатора. Однако проблема возникает при попытке вызвать универсальную функцию setData с определенным типом, например setData
Язык запрещает эту конструкцию, поскольку компилятору пришлось бы динамически отправлять бесконечное количество возможных экземпляров шаблона. Для решения этой проблемы возможно несколько подходов:
Удаление статического полиморфизма:
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;
};
Удаление динамического полиморфизма:
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