Я использую std:: Последовательности в приложении MFC и хочу сохранить его в функции doc's Serialize (). Я не хочу хранить их как CString, потому что он пишет свои собственные вещи там, и моя цель состоит в том, чтобы создать файл, который я знаю формат и может быть прочитан другим приложением без необходимости CString. Поэтому я хотел бы сохранить мои std:: последовательности как 4 байта (int) длина последовательности, а затем буфер такого размера, содержащий последовательность.
void CMyDoc::Serialize(CArchive& ar)
{
std::string theString;
if (ar.IsStoring())
{
// TODO: add storing code here
int size = theString.size();
ar << size;
ar.Write( theString.c_str(), size );
}
else
{
// TODO: add loading code here
int size = 0;
ar >> size;
char * bfr = new char[ size ];
ar.Read( bfr, size);
theString = bfr;
delete [] bfr;
}
}
Приведенный выше код не очень велик, и для чтения последовательности мне необходимо назначить значение temp bfr. Сначала можно прочитать последовательность непосредственно в std:: последовательность без временного буфера? Во-вторых, можно ли перегружать -121--1685026-
Опубликовав один из моих самых противоречивых ответов здесь , я осмеливаюсь задать несколько вопросов и в конечном итоге заполнить некоторые пробелы в моих знаниях.
Почему выражение типа ((type _ t *) x)
не считается действительным lvalue, если предположить, что x
само по себе является указателем и lvalue, не просто некоторым выражением?
Я знаю, что многие скажут «стандарт запрещает его», но с логической точки зрения это кажется разумным. В чем причина того, что стандарт запрещает его? В конце концов, любые два указателя имеют одинаковый размер, и тип указателя является просто абстракцией времени компиляции, которая указывает соответствующее смещение, которое должно быть применено при выполнении арифметики указателя.