2012-04-09 25 views
3

是否有(乾淨)的方式來處理從STD一些文字:: CIN將其插入std::string,這樣下會前工作:是否可以使用用戶定義的I/O操縱器來操作某些文本?

cin >> setw(80) >> Uppercase >> mystring; 

其中MyString的是std::string(我不想使用任何包裝字符串)。 Uppercase是一個操縱器。我認爲它需要直接對緩衝區中的字符進行操作(不管現在認爲是大寫還是小寫)。這種操縱器似乎很難以一種乾淨的方式實現,因爲據我所知,用戶定義的操縱器只是用來輕鬆更改或混合某些預定義的格式標誌。

+0

相關但不完全相同:http://stackoverflow.com/questions/1391746/how-to-easily-indent-output-to-ofstream – 2012-04-09 16:51:26

回答

3

(非擴展)操縱器通常只設置提取器後面讀取和響應的標誌和數據。 (這就是xallociwordpword是。)你可以,很明顯,這樣做,是爲了寫東西類似於std::get_money

struct uppercasify { 
    uppercasify(std::string &s) : ref(s) {} 
    uppercasify(const uppercasify &other) : ref(other.ref) {} 
    std::string &ref; 
} 
std::istream &operator>>(std::istream &is, uppercasify uc) { // or &&uc in C++11 
    is >> uc.ref; 
    boost::to_upper(uc.ref); 
    return is; 
} 

cin >> setw(80) >> uppercasify(mystring); 

另外,cin >> uppercase可以返回引用不cin,而是一些(模板)包裝類uppercase_istream的實例化,其相應的過載爲operator>>。我不認爲有一個操縱器修改底層流緩衝區的內容是一個好主意。

如果你足夠絕望,我想你也可以用imbue手工製作的語言環境導致大寫字符串。我認爲我不會讓任何類似的東西通過代碼審查 - 它只是在等待驚喜,並咬下代碼的下一個人。

+0

感謝您的答案。也許你打算說std :: istream&operator >>(std :: istream&is,const uppercasify&uc)因爲uppercasify(mystring)是一個臨時對象 – Martin 2012-04-09 17:33:22

+0

它不能與'const'一起工作,因爲代碼使用非' 'uc.ref'上的const'操作。放下'&'或使用C++ 11並使用'&&'。但是,阿農的提振指標可能是我會遵循的。 – 2012-04-09 17:38:02

+0

對不起,如果我堅持,但ref是一個引用,而不是一個const引用,所以非常量操作應該罰款即使const uppercasify&,不應該嗎?我的gcc編譯器編譯上述代碼只有當我使用const uppercasify&操作符>>(C++ 98 here) – Martin 2012-04-09 17:57:22

相關問題