Estoy intentando escribir una clase que contiene varios std :: vectores como miembros de datos, y proporciona un subconjunto de la interfaz de vector para acceder a ellos:STLifying C++ clases
class Mesh
{
public:
private:
std::vector<Vector3> positions;
std::vector<Vector3> normals;
// Several other members along the same lines
};
Lo más importante que puede hacer con una malla es agregarle posiciones, normales y otras cosas. Con el fin de permitir una manera similar a STL de acceder a una malla (agregar de matrices, otros recipientes, etc.), estoy jugando con la idea de los métodos de la adición de la siguiente manera:
public:
template<class InIter>
void AddNormals(InIter first, InIter last);
El problema es que, de lo Entiendo las plantillas, estos métodos deberán definirse en el archivo de encabezado (parece tener sentido, sin un tipo de iterador concreto, el compilador no sabe cómo generar código objeto para la implementación obvia de este método).
¿Esto es realmente un problema? Mi reacción visceral no es andar pegando grandes cantidades de código en los archivos de encabezado, pero mi C++ está un poco oxidado con poca experiencia de STL fuera de los ejemplos de juguetes, y no estoy seguro de qué práctica de codificación C++ "aceptable" tiene esto.
¿Existe alguna forma mejor de exponer esta funcionalidad conservando un sabor genérico de programación tipo STL? Una forma sería algo como esto:
(lista final)
class RestrictedVector<T>
{
public:
RestrictedVector(std::vector<T> wrapped)
: wrapped(wrapped) {}
template <class InIter>
void Add(InIter first, InIter last)
{
std::copy(first, last, std::back_insert_iterator(wrapped));
}
private:
std::vector<T> wrapped;
};
y luego exponer los casos de estos en malla en su lugar, pero eso está empezando a oler un poco de manipulación excesiva: P Cualquier consejo es ¡apreciado enormemente!
Dos candidatos para soluciones, ambos usando lo que parecen ideas muy específicas de C++ :) Muchas gracias, eso es enormemente útil. – shambulator