Tôi đang viết hàm băm cho đối tượng của mình. Tôi đã có thể băm thùng chứa và kết hợp băm, nhờ vào Generic Hash function for all STL-containers. Nhưng lớp học của tôi cũng có enums. Tất nhiên tôi có thể tạo ra một hàm băm cho mỗi enum, nhưng nó không có vẻ giống như một ý tưởng tốt. Có thể tạo ra một số đặc tả chung cho std::hash
, để nó có thể được áp dụng cho mọi enum? Tương tự, sử dụng std::enable_if
và std::is_enum
C++ 11 Hàm băm cho bất kỳ loại enum nào
namespace std {
template <class E>
class hash<typename std::enable_if<std::is_enum<E>::value, E>::type> {
public:
size_t operator()(const E& e) const {
return std::hash<std::underlying_type<E>::type>()(e);
}
};
};
PS. Mã này không biên dịch
error: template parameters not used in partial specialization:
error: ‘E’
Mẫu băm này 'mẫu xác định mẫu chính 'băm', không phải là chuyên môn. Một chuyên môn sẽ trông giống như: 'mẫu băm lớp >'. Tôi thực sự không nghĩ rằng bạn có thể xác định lại mẫu chính 'std :: hash '. –
cdyson37
@ cdyson37 Ngoài ra, những gì bạn đề cập dường như là _partial specialization_ chuyên môn hóa đầy đủ sẽ giống như 'template <> struct hash {...};' ** Hơn nữa **, chuyên môn hóa một phần là chống lại tiêu chuẩn và được chỉ định là ** hành vi không xác định **. Xem [SO câu hỏi/câu trả lời] này (http://stackoverflow.com/questions/28077592/extending-namespace-std-via-partial-template-specialization). –
Nó thực sự là một chuyên môn hóa một phần. Nhưng tôi tin rằng nó được cho phép - xem [ở đây] (http://stackoverflow.com/questions/23339298/stdhash-template-partial-specialization) – cdyson37