Giả nơi nào đó trong mã của tôi là một hàm foo
với một tham số tài liệu tham khảo phổ quát, mà tôi không thể thay đổi:độ phân giải C++ quá tải với chức năng tham khảo phổ mẫu mà không thể thay đổi
template<typename T>
auto foo(T&& t) { std::cout<<"general version"<<std::endl; }
Bây giờ tôi muốn quá tải foo
cho một lớp nhất định A
và đảm bảo rằng đối với bất kỳ loại vòng loại và tham chiếu nào của số A
, quá tải được gọi. Đối với tôi điều này có thể brute-forcely cung cấp một tình trạng quá tải cho tất cả các bằng cấp có thể (bỏ qua volatile
cho bây giờ):
auto foo(A & a) { std::cout<<"A&"<<std::endl; }
auto foo(A const& a) { std::cout<<"A const&"<<std::endl; }
auto foo(A && a) { std::cout<<"A &&"<<std::endl; }
auto foo(A const&& a) { std::cout<<"A const&&"<<std::endl; }
Demo. Tuy nhiên, điều này quy mô rất kém để biết thêm thông số.
Ngoài ra, tôi có thể vượt qua bởi giá trị, mà dường như để nắm bắt cũng như tất cả các trường hợp theo thời gian:
auto foo(A a) { std::cout<<"A"<<std::endl; }
Demo. Bây giờ, tuy nhiên đối tượng lớn cần phải được sao chép (- ít nhất là về nguyên tắc).
Có cách nào thanh lịch xung quanh những vấn đề này không?
Hãy nhớ rằng tôi không thể thay đổi chức năng tham chiếu phổ quát, vì vậy SFINAE và những thứ tương tự không có khả năng.
Viết hàm bao hàm để chuyển tiếp các đối số đến đúng chức năng và sử dụng giải pháp đó thay vì hợp lý cho bạn? – TartanLlama
AFAIK trình biên dịch luôn tìm kiếm các tùy chọn cụ thể nhất. Điều gì xảy ra nếu bạn thêm một enable_if> vào "quá tải"? –
@ TartanLlama: không thực sự. Trong mã, hàm tương ứng là 'operator &&' (tôi chỉ lấy 'foo' làm ví dụ đơn giản). Đó là một thư viện và đó là quá sai lầm. – davidhigh