- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Tôi đang cố gắng triển khai HashTable trong C++ thông qua các mẫu. Đây là chữ ký:
mẫu
lớp HashTable {
public:
void add(T1 a, T2 b);
void hashFunction(khóa T1, giá trị T2)
{
// cách triển khai hàm này bằng cách sử dụng key làm generic
// chúng ta cần biết loại đối tượng của khóa
}
};
Vì vậy, tôi không thể tiếp tục triển khai khóa phổ quát.
Trong Java, tôi có thể dễ dàng chuyển đổi khóa thành chuỗi và sau đó vui vẻ triển khai hàm băm của khóa dưới dạng chuỗi. Tuy nhiên, trong C++, điều tôi biết là có một khái niệm về RTTI, nó tự động chuyển đổi một đối tượng thành đối tượng mong muốn.
Nếu cách tiếp cận này hoàn toàn chính xác thì làm cách nào để triển khai chuyển đổi động này?
Nếu sử dụng mẫu không phải là cách phù hợp để triển khai generic trong trường hợp này thì vui lòng đề xuất một số cách tốt hơn.
câu trả lời hay nhất
Bạn thường sẽ sử dụng std::băm
Để làm điều này, hãy để người triển khai kiểu chuyên môn hóa mẫu nếu cần.
size_t key_hash = std::hash()(key);
Bạn không thể triển khai hàm băm một cách tổng quát cho bất kỳ loại ngẫu nhiên cụ thể nào. Nếu hai đối tượng bằng nhau thì mã băm của chúng phải giống nhau. Bạn có thể chỉ cần chạy bộ nhớ thô của đối tượng thông qua hàm băm, nhưng những loại này có thể triển khai các triển khai bỏ qua dữ liệu đối tượng nhất định (ví dụ: đối tượng đồng bộ hóa) toán tử==
Quá tải. Trong trường hợp đó bạn có thể (và có thể dễ dàng) trả về các giá trị băm khác nhau cho cùng một đối tượng.
Về c++ - Cách triển khai hàm băm phổ quát trong C++, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/16243711/
Tôi là một lập trình viên xuất sắc, rất giỏi!