> 백엔드 개발 > C++ > `를 오버로드할 때 `std::endl`을 처리하는 방법

`를 오버로드할 때 `std::endl`을 처리하는 방법

Susan Sarandon
풀어 주다: 2024-12-07 04:25:21
원래의
330명이 탐색했습니다.

How to Handle `std::endl` When Overloading the `

오버로딩 연산자<< 사용자 정의 endl 처리

연산자 오버로드 시<< 연산자를 사용하면 std::endl을 사용하려고 할 때 컴파일 오류가 발생할 수 있습니다. 이 오류는 컴파일러가 적절한 연산자<<를 찾을 수 없기 때문에 발생합니다. std::endl 유형을 처리하기 위한 구현입니다.

이 문제를 해결하려면 std::endl이 객체가 아니라 함수라는 점을 이해해야 합니다. 이를 수용하기 위해 std::cout에는 자체 연산자<<가 있습니다. std::endl과 동일한 시그니처를 가진 함수 포인터를 특별히 취하는 오버로드입니다. 호출되면 이 오버로드가 함수를 호출하고 반환 값을 전파합니다.

사용자 정의 스트림이 std::endl을 처리할 수 있게 하려면 유사한 접근 방식이 필요합니다. 다음은 이를 보여주는 예제 코드입니다.

#include 

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&);

    // Overload to accept functions with custom signature
    MyStream& operator<<(MyStreamManipulator manip) {
        return manip(*this);
    }

    // Custom `endl` implementation for this stream
    static MyStream& endl(MyStream& stream) {
        std::cout << std::endl;
        stream << "Called MyStream::endl!" << std::endl;
        return stream;
    }

    // Type of std::cout
    typedef std::basic_ostream> CoutType;

    // Function signature of std::endl
    typedef CoutType& (*StandardEndLine)(CoutType&);

    // Overload to accept std::endl
    MyStream& operator<<(StandardEndLine manip) {
        manip(std::cout);
        return *this;
    }
};

int main() {
    MyStream stream;

    stream << 10 << " faces." << MyStream::endl << std::endl;

    return 0;
}

이 코드에는 다음이 있습니다.

  • 오버로드된 연산자<< MyStream이 사용자 정의 서명으로 일반 유형 및 함수를 처리하도록 합니다.
  • 새 줄과 추가 정보를 인쇄하는 사용자 정의 endl 함수를 정의했습니다.
  • 오버로드된 연산자<< MyStream이 std::endl의 함수 포인터를 인수로 받아들이도록 합니다.

이 접근 방식을 사용하면 예제의 MyStream과 같은 사용자 정의 스트림이 std::endl을 지원하고 이를 사용할 때 사용자 정의 동작을 제공할 수 있습니다.

위 내용은 `를 오버로드할 때 `std::endl`을 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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