사용자 정의 스트림 구현에서 std::endl 연산자 오버로딩 및 처리
다음 코드 조각을 고려하세요. 여기서 연산자는<< 오버로드됨:
template <typename T> UIStream& operator<< (const T); UIStream my_stream; my_stream << 10 << " heads";
이것은 예상대로 작동하지만 my_stream << endl은 "binary '<<'라는 컴파일 오류를 발생시킵니다. : 'UIStream' 유형의 왼쪽 피연산자를 사용하는 연산자를 찾을 수 없습니다..."
이 문제를 해결하려면 std::endl이 객체가 아니라 함수라는 점을 이해하는 것이 중요합니다. std::cout에서는 연산자<<를 구현하여 활용됩니다. std::endl과 동일한 서명을 가진 함수 포인터를 허용합니다. 호출되면 함수가 호출되고 해당 반환 값이 전달됩니다.
연산자의 사용자 정의 구현<< 유사한 방식으로 std::endl을 처리하도록 정의할 수 있습니다.
struct MyStream { templateMyStream& operator<< (const T& x) { std::cout << x; return *this; } // Function that takes a custom stream and returns it typedef MyStream& (*MyStreamManipulator)(MyStream&); // Accept function with custom signature MyStream& operator<< (MyStreamManipulator manip) { return manip(*this); } // Define a custom endl for this stream (matches MyStreamManipulator signature) static MyStream& endl(MyStream& stream) { std::cout << std::endl; stream << "Called MyStream::endl!" << std::endl; return stream; } }; 이 사용자 정의 구현은 연산자<< 두 가지 유형을 허용합니다:
- 첫 번째 유형은 MyStream 개체에 대한 참조를 가져와 동일한 개체에 대한 참조를 반환하는 일반 함수 포인터입니다.
- 두 번째 유형은 MyStream 개체에 대한 참조를 구체적으로 가져와 동일한 개체에 대한 참조를 반환하는 함수 포인터.
이를 통해 사용자 정의 endl 함수를 구현할 수 있습니다. 사용자 정의 스트림에서 작동합니다.
위 내용은 사용자 정의 스트림 연산자 오버로딩에서 `std::endl`을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!