Для этого вам нужно определить какой-либо тип сериализации для вашего векторного типа, а также вам нужно полагаться на содержащийся тип, чтобы знать, как сериализовать и десериализовать себя.
Сериализация и десериализация оба могут быть реализованы как операторы, и им даже не нужно быть друзьями вашего вектора, поскольку они могут работать с интерфейсом publi c.
Вот некоторый псевдокод, который вы можете использовать sh out:
template <typename T>
std::ostream & operator<<(std::ostream & stream, Vector<T> const & vec) {
// Possibly write length information using vec.size()
if (stream << vec.size()) {
for (int i = 0; i < vec.size(); ++i) {
// Possibly frame the data; regardless, write out each element using:
if (!(stream << vec[i])) { break; }
}
}
return stream;
}
template <typename T>
std::istream & operator>>(std::istream & stream, Vector<T> & vec) {
// Possibly read length information...
int size;
if (stream >> size) {
while (size--) {
// Possibly read framing.
T value;
if (!(stream >> value)) { break; }
vec.add(value);
}
}
return stream;
}
Это, очевидно, не полная реализация. Вы, вероятно, захотите как-то кадрировать каждый элемент, чтобы вы знали, где каждый начинается и заканчивается.
T
требуется реализация потоковых операторов для компиляции.
Сторона примечание: ваш шаблон Vector
нарушает правило трех / пяти ; Вы определяете пользовательский деструктор, но не реализуете конструктор копирования, оператор копирования-назначения, конструктор перемещения или оператор назначения-перемещения. Если вы создаете копию значения Vector
по значению, уничтожение источника или места назначения копии приведет к неопределенному поведению при использовании другого объекта.
Самое простое решение этой проблемы, предполагая, что C Компилятор ++ 11 предназначен для удаления этих членов, чтобы компилятор не генерировал неправильные версии:
template <class T>
class Vector
{
public:
Vector(Vector const &) = delete;
Vector(Vector &&) = delete;
Vector & operator=(Vector const &) = delete;
Vector & operator=(Vector &&) = delete;
// ...
};
В более старых версиях C ++ объявляйте члены закрытыми, но не предоставляйте реализацию. Это предотвратит копирование извне класса или его друзей и вызовет ошибку времени соединения, если привилегированный код попытается сделать копию:
template <class T>
class Vector
{
private:
// Don't implement any of these!
Vector(Vector const &);
Vector(Vector &&);
Vector & operator=(Vector const &);
Vector & operator=(Vector &&);
public:
// ...
};
Конечно, если возможно, вы должны реализовать это так что ваш тип может быть правильно скопирован / перемещен.