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

DDD
Lepaskan: 2024-11-06 10:00:04
asal
580 orang telah melayarinya

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"
Salin selepas log masuk

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;
}
Salin selepas log masuk

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()));
    }
};
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!