Sử dụng VC++ 2010, đưa ra sau đây:Tại sao trình biên dịch chọn chức năng mẫu này trên một chức năng không mẫu quá tải?
class Base { };
class Derived : public Base { };
template<class T> void foo(T& t); // A
void foo(Base& base); // B
Derived d;
foo(d); // calls A
foo(static_cast<Base&>(d)); // calls B
Tôi muốn "B" được gọi là ở trên. Tôi có thể đạt được điều này với một dàn diễn viên để Base
, nhưng tại sao điều này là cần thiết?
Tôi muốn chức năng mẫu được gọi cho tất cả các loại không có nguồn gốc từ Base
(kiểu tích hợp, v.v.), nhưng tôi muốn quá tải mẫu không được gọi cho các loại bắt nguồn từ Base
, mà không yêu cầu khách hàng để đúc một cách rõ ràng. Tôi cũng đã cố gắng làm quá tải một chuyên môn của mẫu, nhưng hành vi tương tự xảy ra trong trường hợp đó. Cách thành ngữ để có được những gì tôi đang tìm kiếm là gì?
Đây có phải là điều C++ 11 hay nó hoạt động trong mã cũ hơn - chỉ hỏi vì nó tuyệt vời :)? –
@ w00te: 'is_base_of' và' enable_if' được bao gồm trong Boost, C++ TR1 và C++ 11. Không yêu cầu chức năng C++ 11 cho chúng; bạn có thể định nghĩa chúng chỉ sử dụng các tính năng ngôn ngữ C++ 03. –
@ w00te: bạn có thể làm điều đó trong C++ 03, nhưng bạn phải lấy 'enable_if' và' is_base_of' từ tăng (hoặc cuộn của riêng bạn, điều này sẽ dạy cho bạn một vài điều về C++). –