Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Anda Boleh Mencipta Manipulator Strim Tersuai untuk Mengubah Suai Item Strim Seterusnya dalam C?

Bagaimanakah Anda Boleh Mencipta Manipulator Strim Tersuai untuk Mengubah Suai Item Strim Seterusnya dalam C?

DDD
DDDasal
2024-11-06 10:00:04644semak imbas

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

Mencipta Manipulator Strim Tersuai yang Mengubah Suai Item Strim Seterusnya

Pengenalan:
Dalam C , manipulator strim ialah berguna untuk mengubah format dan tingkah laku operasi aliran. Artikel ini meneroka cara membuat manipulator tersuai yang boleh mengubah suai item yang mengikutinya pada strim.

Mencipta Manipulator "Tambah Satu":
Pertimbangkan manipulator "plusone" yang diterangkan dalam soalan:

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

Untuk melaksanakan manipulator ini, kita perlu mencapai dua perkara:

  1. Keadaan Stor: Setiap aliran mesti mengekalkan keadaan dalaman yang menunjukkan sama ada item seterusnya perlu ditambah.
  2. Caut ke dalam Output Numerik: Operasi output angka dilakukan mengikut faset. Kami boleh menentukan aspek tersuai yang mengubah suai nombor sebelum ia dikeluarkan.

Keadaan Menyimpan:
Kami menggunakan storan perkataan strim untuk mengaitkan keadaan dengan strim:

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;
}

Mengubah Suai Output Numerik:
Kami mentakrifkan faset nombor tersuai:

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()));
    }
};

Faset ini menambah nombor sebelum mengeluarkannya, berdasarkan keadaan yang disimpan dalam strim.

Menguji Manipulator:

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

Menghadkan Penambahan kepada Item Seterusnya:
Untuk hanya menambah yang seterusnya item, tetapkan semula keadaan strim kepada 0 selepas setiap operasi do_put.

Atas ialah kandungan terperinci Bagaimanakah Anda Boleh Mencipta Manipulator Strim Tersuai untuk Mengubah Suai Item Strim Seterusnya dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn