有沒有辦法在C++中編寫一個接受左值和右值參數的函數,而不必將其作爲模板?同時接受左值和右值參數的函數
例如,假設我編寫了一個函數print_stream
,該函數從istream
中讀取並打印讀取到屏幕上的數據或其他內容。
我認爲這是合理的調用print_stream
這樣的:
fstream file{"filename"};
print_stream(file);
以及像這樣:
print_stream(fstream{"filename"});
但我怎麼聲明print_stream
這樣既利用工作?
如果我聲明爲
void print_stream(istream& is);
然後第二使用不能編譯,因爲右值將不結合到一個非const左值參考。
如果我聲明爲
void print_stream(istream&& is);
然後在第一次使用不能編譯,因爲左值將不結合到一個rvalue參考。
我若爲
void print_stream(const istream& is);
那麼函數的實現不能編譯,因爲你不能從一個const istream
讀取。
我不能將該函數作爲模板並使用「通用引用」,因爲它的實現需要單獨編譯。
我公司可提供兩個重載:
void print_stream(istream& is);
void print_stream(istream&& is);
,並有第二個呼叫第一個,但好像很多不必要的樣板,我會覺得很不幸有這樣做,我每一次用這樣的語義編寫一個函數。
有什麼更好的我可以做嗎?
你可以使用void print_stream(Wrapper)並將問題移動到Wrapper的構造函數,這隻有在你想對幾個函數執行相同時纔有意義。 –
「每次我用這樣的語義編寫函數」?您是否經常編寫需要採用非常量非可複製參數的函數,並且必須使用臨時參數和左值參數來調用函數?這是一個非常具體的例子,而不是我擔心的「每次我必須用這樣的語義編寫函數」。如果參數是可複製的,您可以簡單地通過值來傳遞它。如果你不需要調用非const函數,你可以通過const引用 – jalf
傳遞你可以寫一個幫手腳本'template T&stay(T && t){return t; }'並使用'stay(fstream {「filename」})''。 –