Кто-нибудь объяснит строку кода C++
std::ostream & _return = ::operator<<(_os, _event)
Особенно я хотел бы знать: каков тип данных _return
и как я могу распечатать его в консоли.
2 ответа
std::ostream & _return =::operator<< (_ os, _event);
Особенно мне хотелось бы знать: что такое тип данных _return и как я могу распечатать его в консоли.
Код ищет operator<<
в глобальном масштабе (не в любом пространстве имен), который может принять _os
а также _event
объекты как параметры. Это не обязательно верно, но, учитывая, что "<<" является нормальным способом потокового вывода в C++, вы можете ожидать, что это, вероятно, будет такая функция, как:
std::ostream& operator<<(std::ostream&, const Event&);
Где Событие, какой бы тип _event
объект, и я предположил _os
будет какой-то тип, полученный из std::ostream
и, следовательно, может обрабатываться ссылкой на std::ostream
,
Почти все такие operator<<
функции возвращают свой первый аргумент потока, поэтому ваш код, вероятно, выполняет какой-то вывод, а затем эффективно присваивает _return
как будто это было:
std:: ostream & _return = _os;
Здесь статический тип _return
сам по себе std::ostream&
- ссылка на std::ostream
(Стандартный поток вывода), но тип времени выполнения будет любого типа _os
имеет... это тип объекта, с которым работают _return
вызовет полиморфно. Это могло быть ofstream
, ostringstream
или много других типов.
Как я могу распечатать его в консоли.
Не существует стандартного способа получения имен текстовых типов в C++, хотя полиморфные типы времени выполнения действительно имеют информацию о типе времени выполнения, которая включает в себя необязательное текстовое поле, которое обычно заполняется каким-либо именем типа - будет ли оно иметь полные квалификаторы пространства имен, искажение имен или что бы то ни было не указано, но вы можете попробовать это достаточно легко:
std::cout << typeid(_return).name() << '\n';
(Для GCC, смотрите Unmangling результат std::type_info::name для советов по дешифровке таких имен типов)
_return
это просто переменная типа "Ссылка на std::ostream
объект класса ". И он инициализируется с возвращаемым значением <<
оператор в глобальном пространстве имен ::operator<<(ostream& os, const some_Obj_reference& ref)
,
Это может быть так жеstd::ostream & _return = (_os <<_event);