que actualmente tienen la siguiente función para leer una matriz o un vector de datos en bruto (_readStream
es una std::ifstream
):¿Cómo comprobar si los iteradores forman una zona de memoria contigua?
template<typename IteratorType>
inline bool MyClass::readRawData(
const IteratorType& first,
const IteratorType& last,
typename std::iterator_traits<IteratorType>::iterator_category* = nullptr
)
{
_readStream.read(reinterpret_cast<char*>(&*first), (last-first)*sizeof(*first));
return _readStream.good();
}
Primera pregunta: ¿esta función parece bien para usted?
Como leemos directamente un bloque de memoria, solo funcionará si el bloque de memoria de first
a last
es contiguo en la memoria. ¿Cómo verificar eso?
Su función hace muchas suposiciones sobre cómo se usará. Sería mejor si fueran explícitos, o al menos documentados. Entre estos supuestos: 1) Que los elementos pueden ser serializados por su representación binaria en la memoria. 2) Que la duración del tiempo de ejecución es la misma que la del que escribió los datos. – Cameron
En realidad, ¿por qué usar iteradores en absoluto cuando la función es completamente no genérica? Su único propósito es copiar elementos a granel en bits en la memoria. Cambie el nombre de la función para reflejar esto, y pídale que tome un puntero y un conteo en lugar de iteradores ... La pregunta en su título aún es interesante :-) – Cameron
Tengo otra función para intercambiar los datos si la endianidad fue diferente, así que el segundo punto no es un problema – Vincent