我想把這個邏輯放到一個輔助函式中:
std::stringstream ss;
std::string str = "some str";
if (do_check(str)) {
ss << str;
} else {
ss << do_edit(str);
}
而是把它寫成
std::string edit_str(const std::string &str) {
if (do_check(str)) {
return str;
}
return do_edit(str);
}
main() {
std::stringstream ss;
std::string str = "some str";
ss << edit_str(str);
}
但是,當我回傳 str 時,這會創建一個副本。有沒有辦法將它寫成一個沒有/最小開銷的輔助函式?我愿意更改引數/回傳型別、使用輸出引數、模板等,但我想避免使用宏。
uj5u.com熱心網友回復:
標準庫為如何使用諸如std::quoted. 該函式實際上不起作用;它只是將引數的參考存盤到一個物件中,稱為 IO 操縱器。那么該operator<<物件的實際作業是什么。我們可以簡單地效仿他們。
struct edited { // playing a little fast-and-loose; instead of a dedicated function we just aggregate-initialize this struct with a function-like syntax (requires C 20)
std::string const &str;
friend std::ostream &operator<<(std::ostream &out, edited const &thiz) {
// you can put whatever block of code you'd like to factor out in here
if (do_check(thiz.str)) out << thiz.str;
else out << do_edit(thiz.str);
return out;
}
};
int main() {
std::string str = "some string";
std::cout << edited(str);
}
你必須小心不要edited(str)像字串一樣意外使用。你應該用它做的唯一一件事就是將<<它放入一個流中。如果您std::string在某個時候需要它,請制作 astd::stringstream并使用它來收集輸出。此外,它可能是有益的行內do_edit成operator<<和調整它,所以它不會回傳一個中間字串,然后得到輸出,但正好可以直接輸出了。
uj5u.com熱心網友回復:
有時,稍微公開一點就可以了:
ss << (is_whavever(str) ? str : fix_whatever(str));
您的do_check和do_edit函式僅以描述方式命名。
一旦你開始在太多地方擁有這段代碼,你就可以開始考慮是否應該撰寫一個幫助類(參見其他答案)。此外,如果您正在使用 API 制作一個庫,您以后不允許進行更改,那么您可能會從一些額外的功能開始。但除此之外,不要過度設計它。
uj5u.com熱心網友回復:
您可以使用具有以下多載的自定義型別<<:
#include <string>
#include <sstream>
#include <iostream>
bool do_check(const std::string&) {return false;}
void do_edit(std::string& in){
in = "foo";
}
struct checked_string {
std::string& value;
};
std::ostream& operator<<(std::ostream& out,const checked_string& cs) {
if (! do_check(cs.value)) {
do_edit(cs.value);
}
out << cs.value;
return out;
}
int main() {
std::string str = "some str";
std::cout << checked_string{str};
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/397877.html
標籤:C
