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:
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!