> 백엔드 개발 > C++ > 사용자 정의 스트림 연산자 오버로딩에서 `std::endl`을 처리하는 방법은 무엇입니까?

사용자 정의 스트림 연산자 오버로딩에서 `std::endl`을 처리하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-08 08:26:12
원래의
237명이 탐색했습니다.

How to Handle `std::endl` in Custom Stream Operator Overloading?

사용자 정의 스트림 구현에서 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
{
    template 
    MyStream& 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿