>백엔드 개발 >C++ >C에서 후속 스트림 항목을 수정하기 위해 사용자 정의 스트림 조작기를 어떻게 만들 수 있습니까?

C에서 후속 스트림 항목을 수정하기 위해 사용자 정의 스트림 조작기를 어떻게 만들 수 있습니까?

DDD
DDD원래의
2024-11-06 10:00:04648검색

How Can You Create a Custom Stream Manipulator to Modify Subsequent Stream Items in C  ?

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

소개:
C에서 스트림 조작기는 다음과 같습니다. 스트림 작업의 형식과 동작을 변경하는 데 유용합니다. 이 문서에서는 스트림에서 항목을 수정할 수 있는 사용자 정의 조작기를 만드는 방법을 살펴봅니다.

"하나 추가" 조작기 만들기:
에 설명된 "plusone" 조작기를 고려하세요. 질문:

int num2 = 1;
std::cout << "1 + 1 = " << plusone << num2; // "1 + 1 = 2"
std::cout << num2; // "1"

이 조작기를 구현하려면 두 가지를 달성해야 합니다.

  1. 저장 상태: 각 스트림은 다음을 나타내는 내부 상태를 유지해야 합니다. 다음 항목을 증가시켜야 하는지 여부.
  2. 숫자 출력 후크: 숫자 출력 작업은 패싯에 의해 수행됩니다. 숫자가 출력되기 전에 수정하는 사용자 정의 패싯을 정의할 수 있습니다.

상태 저장:
스트림 단어 저장소를 사용하여 상태를 스트림과 연결합니다.

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으로 문의하세요.