有没有一种在C++中编写既能接受lvalue参数又能接受rvalue参数的函数的方法,而不将其作为模板?
例如,假设我编写了一个函数print_stream
,它从istream
中读取并将读取的数据打印到屏幕上或其他地方。
我认为可以像这样调用print_stream
:
fstream file{"filename"};
print_stream(file);
就像这样:
print_stream(fstream{"filename"});
但是我该如何声明print_stream
才能使两种用法都起作用呢?
如果我将其声明为
void print_stream(istream& is);
那么第二个用法将无法编译,因为rvalue无法绑定到非const的左值引用。
如果我将其声明为
void print_stream(istream&& is);
如果我将其声明为
那么第一次使用将无法编译,因为左值无法绑定到右值引用。
void print_stream(const istream& is);
如果函数的实现尝试从 const istream
读取内容,则无法编译。
我不能将该函数设为模板并使用“通用引用”,因为其实现需要单独编译。
我可以提供两个重载版本:
void print_stream(istream& is);
void print_stream(istream&& is);
我希望第二个函数调用第一个函数,但这似乎有很多不必要的模板代码,如果每次编写具有这种语义的函数都需要这样做,那将是非常不幸的。
我能做些什么更好的方法吗?
template <typename T> T & stay(T && t) { return t; }
,然后使用stay(fstream { "filename" })
。 - Kerrek SB