Можно ли перегружать оператора CArchive < < для работы со std:: Последовательностью?

Я использую 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-

Приведение указателя в состояние lvalue не приводит. Почему? Опубликовав один из моих самых противоречивых ответов здесь, я осмеливаюсь задать несколько вопросов и в конечном итоге заполнить некоторые пробелы в моих знаниях. Почему выражение вида ((type _ t *) x) не считается...

Опубликовав один из моих самых противоречивых ответов здесь , я осмеливаюсь задать несколько вопросов и в конечном итоге заполнить некоторые пробелы в моих знаниях.

Почему выражение типа ((type _ t *) x) не считается действительным lvalue, если предположить, что x само по себе является указателем и lvalue, не просто некоторым выражением?

Я знаю, что многие скажут «стандарт запрещает его», но с логической точки зрения это кажется разумным. В чем причина того, что стандарт запрещает его? В конце концов, любые два указателя имеют одинаковый размер, и тип указателя является просто абстракцией времени компиляции, которая указывает соответствующее смещение, которое должно быть применено при выполнении арифметики указателя.

12
задан Community 23 May 2017 в 12:33
поделиться