Tôi đã có một kiểu liệt kê được định nghĩa bên trong một lớp học, và tôi muốn tạo một unordered_set của những đối tượng như một thành viên của lớp:Cách ghi đè std :: hash cho một enum được định nghĩa bên trong một lớp?
#include <unordered_set>
class Foo {
public:
enum Bar {
SOME_VALUE
};
// Error: implicit instantiation of std::hash
std::unordered_set<Bar> getValues() const {
return _values;
}
private:
std::unordered_set<Bar> _values;
};
Bây giờ, tôi biết câu trả lời rõ ràng là thêm một băm chức năng tùy chỉnh để các unordered_set:
std::unordered_set<Bar, BarHasher>
Tuy nhiên, những gì tôi đang tự hỏi là nếu có một cách chuyên std :: băm cho enum Bar để bất cứ ai sử dụng unordered_map được hành vi băm tự động.
Điều này làm việc với mọi loại dữ liệu khác, nhưng không hoạt động với tất cả các loại dữ liệu khác - vì không thể chuyển tiếp thư xác nhận. Để làm việc này, tôi phải đặt định nghĩa của std :: hash sau định nghĩa enum, nhưng trước khi sử dụng lần đầu tiên, có nghĩa là tôi phải đặt nó ở giữa lớp cơ thể, mà sẽ không hoạt động.
Enums có thể được chuyển tiếp tuyên bố, nhưng tôi không thấy nó giúp như thế nào. – chris
Điều này đã được sửa trong c + + 14: http://stackoverflow.com/a/29618545/951890 –