C Virtual Template Method
Em C , pode ser um desafio combinar polimorfismo de tempo estático (modelos) com polimorfismo de tempo de execução. Isso fica evidente na seguinte classe abstrata:
class AbstractComputation {
public:
template virtual void setData(std::string id, T data);
template virtual T getData(std::string id);
};
Esta classe tem como objetivo definir e recuperar dados de um tipo especificado com base em um identificador exclusivo. No entanto, surge um problema ao tentar chamar a função genérica setData com um tipo específico, como setData
A linguagem proíbe esta construção porque o compilador teria que dinamicamente despachar um número infinito de possíveis instanciações de modelo. Para resolver esse problema, várias abordagens são possíveis:
Removendo o 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;
};
Removendo o 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;
};
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3