>백엔드 개발 >C++ >C에서 다음 출력 정수를 증가시키는 사용자 정의 스트림 조작기를 만드는 방법은 무엇입니까?

C에서 다음 출력 정수를 증가시키는 사용자 정의 스트림 조작기를 만드는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-06 11:13:02178검색

How to Create a Custom Stream Manipulator that Increments the Next Outputted Integer in C  ?

스트림의 다음 항목을 수정하는 사용자 정의 스트림 조작기 생성

C에서 16진수 스트림 조작기는 정수를 16진수 형식으로 인쇄하는 편리한 방법을 제공합니다. 이 기사에서는 스트림의 다음 항목을 수정하는 사용자 정의 스트림 조작기를 만드는 방법을 살펴봅니다.

구체적으로 우리는 1씩 인쇄되는 다음 정수 값을 증가시키는 플러스원 조작기를 만드는 것을 목표로 합니다. 이를 달성하려면, 각 스트림에 일부 상태를 저장해야 합니다. 이 목적을 위해 iword 함수와 xalloc이 할당한 인덱스를 사용할 수 있습니다.

inline int geti() { 
    static int i = ios_base::xalloc();
    return i;
}

ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } 
ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }

이 상태를 사용하면 모든 스트림에서 이를 검색할 수 있습니다. 숫자 서식을 수행하는 출력 작업에 연결하기 위해 사용자 정의 패싯을 정의합니다.

struct my_num_put : num_put<char> {
    iter_type 
    do_put(iter_type s, ios_base& f, char_type fill, long v) const { 
        return num_put<char>::do_put(s, f, fill, v + f.iword(geti())); 
    } 

    iter_type 
    do_put(iter_type s, ios_base& f, char_type fill, unsigned long v) const { 
        return num_put<char>::do_put(s, f, fill, v + f.iword(geti())); 
    } 
}; 

이 패싯은 스트림 상태에 저장된 값을 인쇄되는 숫자에 추가합니다.

이제, 플러스원 조작기를 테스트할 수 있습니다.

int main() {
    // outputs: 11121011
    cout.imbue(locale(locale(),new my_num_put));
    cout << add_one << 10 << 11 
         << add_none << 10 << 11;
}

이 코드는 다음 항목을 수정하는 사용자 정의 스트림 조작기를 정의하는 방법을 보여줍니다. 개울. 다음 항목만 증가되도록 하기 위해 각 do_put 호출 후에 스트림 상태를 0으로 재설정할 수 있습니다.

위 내용은 C에서 다음 출력 정수를 증가시키는 사용자 정의 스트림 조작기를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.