Как работает это правое смещение: stringstream >> unsigned int >> unsigned int? - PullRequest
3 голосов
/ 17 марта 2019

Я работаю с книгой SFML Game Development by examples, и я не совсем понимаю, что делает это предложениеЯ никогда не видел что-то подобное

void Anim_Directional::ReadIn(std::stringstream& l_stream){
l_stream >> m_frameStart >> m_frameEnd >> m_frameRow
  >> m_frameTime >> m_frameActionStart >> m_frameActionEnd;
}

Ответы [ 2 ]

5 голосов
/ 17 марта 2019

В C ++ им пришла "яркая" идея перегружать операторы RightsShift и Leftshift потоками для представления сериализации / десериализации.

stream >> var

означает "чтение var из потока".

Симметрично

stream << var

означает «положить переменную в поток»

Операция «потокового» входа или выхода также возвращает поток, поэтому вы можете связывать такие операции, как:

stream >> var1 >> var2;

Обратите внимание, что «потоковая передача» была выбрана только из-за внешнего вида и потому, что приоритет считался разумным, но это все еще просто перегруженный оператор и, например, подразумевает отсутствие строгой последовательности оценки.Например, в:

stream << f() << g();

может быть функция g вызывается (несколько неожиданно) перед функцией f.

ПРИМЕЧАНИЕ: проблема секвенирования была решена путем добавления этого особого случая впоследний стандарт C ++ (C ++ 17).Хотя в общем случае он не выполняется, он гарантирован для операторов сдвига (предположительно по этой конкретной причине).Так что в f()+g() может быть f вызывается позже, чем g, но в f()<<g() этого не может быть.

0 голосов
/ 17 марта 2019

C ++ позволяет перегружать операторы >> и <<. std::stringstream является производной от std::istream и наследует перегрузки оператора >> от std::istream.

std::istream имеет множество перегрузок для многих распространенных типов. Вы можете найти их список здесь .

Типичная std::istream >> перегрузка оператора выглядит следующим образом:

std::istream& operator>>(std::istream& stream, YourType& var) {
    /* 
    ** code here to parse and read a 'YourType' into 'var'
    */
    /* var is set */
    return stream; /* return the same stream to allow chaining */
}

Когда вы делаете some_stream >> YourType_object, вызывается соответствующая перегрузка оператора >>. В вышеупомянутом случае перегрузка нашего оператора вызывается с параметром stream, принимающим some_stream и var, принимающим YourType_object.

Перегрузки >> (и перегрузки << тоже) разумно возвращают поток, которым они управляли; тем самым, позволяя объединить ряд операторов >>.

...