有没有办法在C++中编写一个接受左值和右值参数的函数,而不是模板?
例如,假设我编写了一个print_stream从a 读取istream并打印读取到屏幕的数据的函数.
我认为print_stream像这样打电话是合理的:
fstream file{"filename"};
print_stream(file);
Run Code Online (Sandbox Code Playgroud)
以及像这样:
print_stream(fstream{"filename"});
Run Code Online (Sandbox Code Playgroud)
但是我如何声明print_stream这两种用途都有效呢?
如果我声明它
void print_stream(istream& is);
Run Code Online (Sandbox Code Playgroud)
然后第二次使用将无法编译,因为rvalue不会绑定到非const左值引用.
如果我声明它
void print_stream(istream&& is);
Run Code Online (Sandbox Code Playgroud)
然后第一次使用将无法编译,因为左值不会绑定到右值引用.
如果我声明它
void print_stream(const istream& is);
Run Code Online (Sandbox Code Playgroud)
那么函数的实现将无法编译,因为你无法读取const istream.
我不能使该函数成为模板并使用"通用引用",因为它的实现需要单独编译.
我可以提供两个重载:
void print_stream(istream& is);
void print_stream(istream&& is);
Run Code Online (Sandbox Code Playgroud)
并且第二次调用第一次,但这似乎是很多不必要的样板,并且我发现每次用这样的语义编写函数时都必须这样做非常不幸.
我能做些什么吗?