Lo que desea es acceso de solo lectura sin copiar toda la masa de datos. Usted tiene un par de opciones.
En primer lugar, sólo podría devolver un refererence const a lo que su contenedor de datos es, como se ha sugerido anteriormente:
const std::vector<T>& getData() { return mData; }
Esto tiene la desventaja de concreción: no se puede cambiar la forma de almacenar los datos internamente sin cambiando la interfaz de tu clase.
En segundo lugar, puede devolver punteros const-ed para los datos reales:
const T* getDataAt(size_t index)
{
return &mData[index];
}
Esto es un poco más agradable, sino que también requiere que se proporcione un getNumItems llaman, y protegerla contra los índices fuera de los límites . Además, la consistencia de sus punteros se descarta fácilmente, y sus datos ahora son de lectura y escritura.
Otra opción es proporcionar un par de iteradores, que es un poco más complejo. Esto tiene las mismas ventajas que los punteros, así como no (necesariamente) la necesidad de proporcionar una llamada a getNumItems, y hay mucho más trabajo involucrado para despojar a los iteradores de su const-ness.
Probablemente la forma más fácil de manejar esto es mediante el uso de un rango de realce:
typedef vector<T>::const_iterator range_iterator_type;
boost::iterator_range<range_iterator_type>& getDataRange()
{
return boost::iterator_range(mData.begin(), mData.end());
}
Esto tiene la ventaja de que son rangos componibles, filtrable, etc, como se puede ver en la website.
Sé que esto es una respuesta de edad, pero lo hago con std :: función ahora: 'for_each_data vacío (const std :: función & f) const;' –
@JoBates Ya no estoy usando C++ día a día, ¡por favor no duden en editar mi respuesta para actualizarla! –