首頁 >後端開發 >C++ >如何建立自訂流程操縱器來修改 C 中的後續流程項目?

如何建立自訂流程操縱器來修改 C 中的後續流程項目?

DDD
DDD原創
2024-11-06 10:00:04642瀏覽

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

將增量限制為下一個項目:
僅增量下一個項目item,每次do_put 操作後將流狀態重置為0。

以上是如何建立自訂流程操縱器來修改 C 中的後續流程項目?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn