Me doy cuenta de lo difícil que pueden ser las preguntas ... Ojalá pueda dar ejemplos que sean ambos lo suficientemente precisos para demostrar mi problema y lo suficientemente cortos como para no estropear todo ... Al menos existe la posibilidad Para editar.C++ Plantilla vs Herencia
Así que este es mi tipo de situación en este momento. Por supuesto que alteré un poco en términos de lógica/estructura (y en términos de nomenclatura de todos modos) tratando de concentrarse en la esencia de mi pregunta:
// MyClass deals with lists (actually several data structures) of the
// type MyType which should support different types and has to be
// efficiently dealt with. Templating seems just right here
class MyClass
{
...
void doSomething<class MyType>(vector<MyType> someList);
...
// At some point I have to extract elements of the type MyType.
// The extractor obviously depends on MyType but it is not possible to
// Create a general version that could use templates itself
// (unless I use a specialization for each possible MyType)
// I am stuck between these two alternatives:
// Possibility1:
// Let the client pass the right extractor and template it.
template<class Extractor, class MyType>
void extract(const Extractor& extractor, const string& source,
vector<MyType>* dest)
{
extractor.extract(source, dest);
}
// Possibility2:
// Use a member _extractor of some base type that has to be set
// to a specialization. The ExtractorBase has a virtual method
// template<T> void extract(const string& source, vector<T>* myType) = 0
// with no definition that is only defined in subclasses wrt certain
// postings.
ExtractorBase _extractor;
template<class MyType>
void extract(const string& source, vector<MyType>* dest)
{
_extractor.extract(source, dest);
}
}
Por el momento yo preferiría possibility1, porque yo no' Tengo que meterme con la herencia en Extractor para todas las variantes de MyType y del Extractor asociado que quiero probar en el futuro.
Por otro lado, los extractores pueden requerir código complejo y varios miembros (algo como mapas enormes que mapean ciertas entradas en ciertos valores). Por lo tanto, no habrá ganancia de rendimiento mediante el uso de plantillas. Particularmente usando solo el archivo de cabecera, los extractores y probablemente incluso los funtores que se suponen que están insertados, están fuera de discusión. En el pasado, esto ha sido un fuerte indicador de que la creación de plantillas solo aumentará la complejidad del código (teniendo que lidiar con la creación de instancias, haciendo la vida más difícil para el código del cliente, etc.) y que debería tratar de evitarlo por completo.
¿O hay una tercera posibilidad en la que no pensé en absoluto?
¿Qué quiere decir exactamente por 'extraer'? ¿Es que solo se va a usar el vector? –
vines
No está claro cómo MyClass está involucrado en el proceso de extracción (y por qué extract() es un _method_ de MyClass?) – user396672