テンプレートにせずに、左辺値と右辺値の両方の引数を受け入れる関数を C++ で記述する方法はありますか?
たとえば、print_stream
から読み取り、読み取っistream
たデータを画面などに出力する関数を作成するとします。
次のように呼び出すのが妥当だと思いますprint_stream
。
fstream file{"filename"};
print_stream(file);
このように:
print_stream(fstream{"filename"});
print_stream
しかし、両方の使用法が機能するように宣言するにはどうすればよいでしょうか?
私がそれを次のように宣言した場合
void print_stream(istream& is);
右辺値が非 const 左辺値参照にバインドされないため、2 番目の使用はコンパイルされません。
私がそれを次のように宣言した場合
void print_stream(istream&& is);
左辺値が右辺値参照にバインドされないため、最初の使用はコンパイルされません。
私がそれを次のように宣言した場合
void print_stream(const istream& is);
から読み取ることができないため、関数の実装はコンパイルされませんconst istream
。
その実装を個別にコンパイルする必要があるため、関数をテンプレートにして「ユニバーサル参照」を使用することはできません。
2 つのオーバーロードを提供できます。
void print_stream(istream& is);
void print_stream(istream&& is);
2 番目の呼び出しを最初の呼び出しにしますが、それは多くの不必要なボイラープレートのように思えます。このようなセマンティクスを持つ関数を記述するたびに、これを行わなければならないのは非常に残念です。
私にできるもっと良いことはありますか?