"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo se puede lograr polimorfismo con métodos de plantilla virtual en C++?

¿Cómo se puede lograr polimorfismo con métodos de plantilla virtual en C++?

Publicado el 2024-11-08
Navegar:342

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

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("foodouble", data).

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:

  • Eliminar el polimorfismo estático introduciendo un tipo separado para almacenar el valor-clave mapeos. Luego, la plantilla puede resolver esto en el nivel base, sin necesidad de polimorfismo:
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:

  • Conservar el polimorfismo en tiempo de ejecución pero eliminar el polimorfismo estático borrando el tipo:
  • Utilizar boost::any, que proporciona borrado de tipos, para almacenar datos de cualquier tipo:
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;
};
Último tutorial Más>

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