有没有办法在 C++ 中编写一个同时接受左值和右值参数的函数,而无需将其设为模板?
例如,假设我编写了一个print_stream
从 an 读取istream
数据并将读取到的数据打印到屏幕上的函数,或者其他什么。
我认为这样称呼是合理的print_stream
:
fstream file{"filename"};
print_stream(file);
以及像这样:
print_stream(fstream{"filename"});
但是我如何声明print_stream
这样两种用法都有效?
如果我将其声明为
void print_stream(istream& is);
那么第二次使用将不会编译,因为右值不会绑定到非常量左值引用。
如果我将其声明为
void print_stream(istream&& is);
那么第一次使用将不会编译,因为左值不会绑定到右值引用。
如果我将其声明为
void print_stream(const istream& is);
那么函数的实现将无法编译,因为您无法从const istream
.
我不能使函数成为模板并使用“通用引用”,因为它的实现需要单独编译。
我可以提供两个重载:
void print_stream(istream& is);
void print_stream(istream&& is);
并让第二个调用第一个,但这似乎是很多不必要的样板文件,我会发现每次我编写具有这样语义的函数时都必须这样做是非常不幸的。
有什么更好的我可以做的吗?