Có cách nào, sử dụng SFINAE, để phát hiện xem chức năng miễn phí có bị quá tải cho một lớp nhất định không?SFINAE: phát hiện xem lớp học có chức năng miễn phí không
Về cơ bản, tôi đã có những giải pháp sau đây:
struct has_no_f { };
struct has_f { };
void f(has_f const& x) { }
template <typename T>
enable_if<has_function<T, f>::value, int>::type call(T const&) {
std::cout << "has f" << std::endl;
}
template <typename T>
disable_if<has_function<T, f>::value, int>::type call(T const&) {
std::cout << "has no f" << std::endl;
}
int main() {
call(has_no_f()); // "has no f"
call(has_f()); // "has f"
}
Đơn giản chỉ cần quá tải call
không hoạt động kể từ khi có thực sự là rất nhiều foo
và bar
loại và call
chức năng không có kiến thức của họ (về cơ bản call
là bên trong một và người dùng cung cấp các loại riêng của họ).
Tôi không thể sử dụng C++ 0x và tôi cần giải pháp làm việc cho tất cả các trình biên dịch hiện đại.
Lưu ý: giải pháp cho một sự kiện similar question không hoạt động ở đây.
vấn đề rất quan trọng. Tôi cũng muốn biết giải pháp. –
Bạn có muốn phát hiện các chức năng chỉ hiển thị tại thời điểm khởi tạo không? –
@Johannes Thực sự không quan trọng trong trường hợp của tôi. Tại điểm khởi tạo (của mẫu hàm), tất cả các hàm ứng viên * sẽ * được biết. –