Método de plantilla virtual C
En C, puede resultar complicado combinar polimorfismo de tiempo estático (plantillas) con polimorfismo de tiempo de ejecución. Esto es evidente en la siguiente clase abstracta:
class AbstractComputation {
public:
template virtual void setData(std::string id, T data);
template virtual T getData(std::string id);
};
Esta clase tiene como objetivo establecer y recuperar datos de un tipo específico en función de un identificador único. Sin embargo, surge un problema al intentar llamar a la función genérica setData con un tipo específico, como setData
El lenguaje prohíbe esta construcción porque el compilador tendría que hacerlo dinámicamente. enviar un número infinito de posibles instancias de plantilla. Para resolver este problema, son posibles varios enfoques:
Eliminar el polimorfismo estático:
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;
};
Eliminación del polimorfismo dinámico:
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;
};
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3