example español array c++ oop stl vector polymorphism

c++ - español - Conversión del vector STL de la subclase al vector de la clase base



vector c++ example (2)

A veces hay formas de evitar esto. Tome un botín en Boost y algunos de los paquetes de meta-programación de plantillas que tienen o usan. Específicamente, vería is_base_of para este tipo de propósitos combinados con la especialización parcial de plantillas.

Por ejemplo, si desea hacer algún truco de magia de plantilla:

template<typename T, bool Allowed> struct TemplateVectorCode;

Usted hace una declaración de avance de una clase con plantilla. Luego haces una especialización con un valor booleano "verdadero":

template<typename T> struct TemplateVectorCode<T, true>{ void operator(const std::vector<T>& myVector) const{ //definition in here } };

Finalmente, utiliza eso con is_base_of para crear instancias solo de instancia de su functor de plantilla de la siguiente manera:

template<typename T, typename Base> struct MyFunction : TemplateVectorCode<T, boost::is_base_of<Base,T>::value>{ };

El punto importante a tener en cuenta es que, dado que no hemos definido un TemplateVectorCode<T, false> el compilador generará un error de compilación si intenta utilizar su functor con un tipo de clase T que no se deriva del tipo V Eso significa que puede trabajar con el mismo código en un solo lugar sin tener que escribir varias versiones de él.

(Si arruiné la especialización de plantilla parcial, alguien edítela. Necesito irme a la cama).

Me pregunto si es posible convertir un vector de valores de clase derivados en un vector de valores de clase base. Específicamente, quiero poder pasar un vector de objetos de clase base a una función cuyos parámetros formales toman un vector de clase base. No parece posible directamente ya que el siguiente ejemplo de código produce un error (usando g ++):

#include <vector> class A { }; class B : public A { }; void function(std::vector<A> objs) { } int main(int argc, char **argv) { std::vector<B> objs_b; objs_b.push_back(B()); function(objs_b); }

test.cc:16: error: conversión de ''std :: vector <B, std :: allocator <B>>'' a tipo no escalar ''std :: vector <A, std :: allocator <A>>'' solicitado

Me gustaría poder llamar a la función sin tener que definir un nuevo vector con elementos de tipo A, insertando mis elementos de tipo B o cambiando a un vector de punteros.


No, no es. vector<B> no se deriva del vector<A> , independientemente del hecho de que B se derive de A Tendrás que cambiar tu función de alguna manera.

Un enfoque C ++ más idiomáticamente podría ser moldearlo y hacer que tome un par de iteradores: esta es la razón por la cual las diversas funciones estándar de la biblioteca ( <algorithm> etc.) funcionan de esa manera, porque separa la implementación del algoritmo del tipo de cosa está funcionando.