Trong khi cố gắng trả lời this question Tôi muốn đề xuất sử dụng enable_if
+ disable_if
để cho phép quá tải phương pháp dựa trên thực tế là loại đó (hoặc không) đa hình.enable_if + disable_if kết hợp kích hoạt một cuộc gọi mơ hồ
Vì vậy, tôi đã tạo ra một tập tin thử nghiệm nhỏ:
template <class T>
void* address_of(T* p,
boost::enable_if< boost::is_polymorphic<T> >* dummy = 0)
{ return dynamic_cast<void*>(p); }
template <class T>
void* address_of(T* p,
boost::disable_if< boost::is_polymorphic<T> >* dummy = 0)
{ return static_cast<void*>(p); }
struct N { int x; };
int main(int argc, char* argv[])
{
N n;
std::cout << address_of(&n) << std::endl;
return 0;
}
mà có vẻ khá hiền lành.
Tuy nhiên gcc (3,4 ...) sặc về điều này:
test.cpp: In function
int main(int, char**)
:
test.cpp:29: error: call of overloadedaddress_of(N*)
is ambiguous
test.cpp:17: note: candidates are:void* address_of(T*, boost::enable_if<boost::is_polymorphic<T>, void>*)
[with T = N]
test.cpp:20: note:void* address_of(T*, boost::disable_if<boost::is_polymorphic<T>, void>*)
[with T = N]
Nó có vẻ khá rõ ràng đối với tâm trí con người của tôi mà quá tải nên được sử dụng ở đây. Tôi có nghĩa là nó có vẻ rõ ràng rằng tôi đã xác định một thay thế và chỉ có một chức năng có thể được sử dụng tại một thời điểm ... và tôi đã có thể nghĩ rằng SFINAE sẽ chăm sóc làm mất hiệu lực quá tải không cần thiết.
Tôi đã vá nó bằng cách sử dụng ...
(dấu ba chấm) thay vì disable_if
và yêu cầu đối số thứ hai giả ... nhưng tôi vẫn quan tâm đến lý do trình biên dịch bị ngắt.
Đã chết! Tôi biết nó sẽ hoạt động ... –