Có cách nào để viết một hàm trong C ++ chấp nhận cả đối số lvalue và rvalue mà không làm cho nó trở thành mẫu không?
Ví dụ: giả sử tôi viết một hàm print_stream
đọc từ an istream
và in dữ liệu đã đọc ra màn hình hoặc một cái gì đó.
Tôi nghĩ là hợp lý khi gọi print_stream
như thế này:
fstream file{"filename"};
print_stream(file);
cũng như như thế này:
print_stream(fstream{"filename"});
Nhưng tôi phải khai báo print_stream
như thế nào để cả hai đều sử dụng được?
Nếu tôi khai báo nó là
void print_stream(istream& is);
thì lần sử dụng thứ hai sẽ không biên dịch vì một giá trị rvalue sẽ không liên kết với một tham chiếu giá trị không const.
Nếu tôi khai báo nó là
void print_stream(istream&& is);
thì lần sử dụng đầu tiên sẽ không biên dịch bởi vì một lvalue sẽ không liên kết với một tham chiếu rvalue.
Nếu tôi khai báo nó là
void print_stream(const istream& is);
thì việc triển khai của hàm sẽ không biên dịch vì bạn không thể đọc từ a const istream
.
Tôi không thể đặt hàm làm mẫu và sử dụng "tham chiếu chung", vì việc triển khai hàm cần được biên dịch riêng.
Tôi có thể cung cấp hai quá tải:
void print_stream(istream& is);
void print_stream(istream&& is);
và có lệnh gọi thứ hai là lệnh đầu tiên, nhưng điều đó có vẻ như rất nhiều bảng soạn sẵn không cần thiết, và tôi sẽ thấy rất đáng tiếc nếu phải thực hiện điều đó mỗi khi tôi viết một hàm với ngữ nghĩa như thế này.
Có điều gì tốt hơn tôi có thể làm không?