2010-10-26 105 views
1

基本上我正在尋找的是具有以下原型的函數:string getln(istream);
我所需要做的就是像PHP的fgets()一樣工作,即將輸入流作爲參數並從流中返回下一行。相當於PHP的fgets()的C++?

我覺得我目前的做法是創建,它被稱爲一個臨時變量每次有點笨重:
string getln(istream &input) { string rtn; getline(input, rtn); return rtn; }

有沒有更好的解決方案?


背景:
我不是在尋找這樣的賦值操作的功能(如some_str = getln(ifile);),但我想用它作爲一個字符串流的數據源。最終我想要一個getline(ifile, tmp); string_str.str(tmp);的較小版本,看起來更像string_str.str(getln(ifile));,但沒有我的示例函數每次創建一個臨時變量的開銷。

如果我對此太挑剔,請隨時打電話給我。我只是希望看看是否有辦法改進我的方法。

+1

你對此太挑剔。你的方法很好。即使有一個getline版本返回一個字符串而不是將一個字符串作爲引用參數,它仍然需要在內部創建一個臨時字符串。 – 2010-10-26 21:39:33

+0

誰說它實際上會創建一個臨時的。你有沒有檢查過RVO沒有踢進去,並且不需要暫時的。另外,很多字符串實現在寫入機制上使用拷貝,因此如果拷貝字符串實際上被拷貝出函數,那麼拷貝字符串並不昂貴。 – 2010-10-26 22:22:49

回答

4

你很挑剔。任何返回字符串的函數都會有一個聲明,填充和返回的字符串變量,就像您已經寫入的函數一樣。

此外,「命名的返回值優化」允許編譯器有時省略額外的變量。調用者將爲該對象分配空間並將其傳遞給你的函數,在那裏它將被修改,就好像它是rtn變量;因爲該值已經在所需的位置,所以在返回時不會進行復制。