Scott Meyers đã đăng nội dung và trạng thái của cuốn sách tiếp theo EC ++ 11. Ông đã viết rằng một mục trong cuốn sách có thể là "Tránh std::enable_if
trong chữ ký chức năng" .
std::enable_if
có thể được sử dụng làm đối số hàm, làm kiểu trả về hoặc làm mẫu lớp hoặc tham số mẫu hàm để loại bỏ có điều kiện các hàm hoặc lớp khỏi độ phân giải quá tải.
Trong câu hỏi này cả ba giải pháp được hiển thị.
Như tham số hàm:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
Như tham số mẫu:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
Như kiểu trả về:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- Giải pháp nào nên được ưu tiên và tại sao tôi nên tránh những người khác?
- Trong trường hợp "Tránh
std::enable_if
trong chữ ký hàm" liên quan đến việc sử dụng như kiểu trả về (không phải là một phần của chữ ký hàm thông thường mà là các chuyên môn mẫu)? - Có sự khác biệt nào đối với các mẫu hàm thành viên và không phải thành viên không?
std::enable_if
làm lộn xộn chữ ký chức năng của mình (đặc biệt là nullptr
phiên bản đối số chức năng bổ sung xấu xí ) bởi vì nó luôn trông giống như một bản hack lạ (đối với một thứ gì đó static if
có thể làm đẹp và sạch sẽ hơn nhiều) bằng cách sử dụng ma thuật đen mẫu để khai thác tính năng ngôn ngữ xen kẽ. Đây là lý do tại sao tôi thích gửi thẻ bất cứ khi nào có thể (tốt, bạn vẫn có thêm các đối số lạ, nhưng không có trong giao diện công cộng và cũng ít xấu xí và khó hiểu hơn nhiều ).
=0
trong typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
thành tựu? Tôi không thể tìm thấy tài nguyên chính xác để hiểu nó. Tôi biết phần đầu tiên trước đây =0
có loại thành viên int
nếu U
và int
giống nhau. Cảm ơn nhiều!