Thư viện chuẩn triển khai std :: hash dưới dạng cấu trúc mẫu chuyên biệt cho các loại khác nhau. Nó được sử dụng như thế này:Tại sao std :: hash a struct thay vì một hàm?
#include <iostream>
#include <functional>
int main()
{
std::hash<int> hasher;
std::cout << hasher(1337) << std::endl;
return 0;
}
Câu hỏi của tôi là lý do đằng sau sự lựa chọn thiết kế này là gì. Tại sao nó không được thực hiện như một mẫu chức năng và sử dụng như thế này:
#include <iostream>
#include <functional>
int main()
{
std::cout << std::hash<int>(1337) << std::endl;
return 0;
}
2 ví dụ giống hệt nhau, sự khác biệt duy nhất là đối tượng thứ hai không được đặt tên. – user2485710
Các thùng chứa liên kết không có thứ tự có tham số kiểu mẫu để chỉ định băm; điều này cho phép sử dụng các đối tượng băm stateful (ví dụ: sử dụng một giá trị đặc biệt XORed trên băm). Việc loại chuyên môn về mẫu chức năng không có cú pháp tốt đẹp. – dyp
@ user2485710 Ví dụ đầu tiên biên dịch, phần thứ hai thì không. Thứ hai sẽ cần phải được viết dưới dạng 'std :: hash() (1337)' để sử dụng cấu trúc tạm thời chưa được đặt tên. –
hvd