2010-08-23 27 views
7

Tôi vẫn đang làm việc trên một giải pháp tốt cho One-Of-A-Type Container Problem của tôi - và sau khi phản ánh tôi nghĩ rằng nó sẽ là tốt đẹp để có thể chỉ cần sử dụng một cái gì đó giống như một std::map<std::type_info, boost::any>. Thật không may, std::type_info không xác định một số operator< và tôi nghĩ điều đó là không hợp lý để xác định.C++ 11 có cung cấp các hàm băm cho std :: type_info không?

Tuy nhiên, có vẻ hợp lý để xác định hàm băm cho nó, bởi vì bạn chỉ có thể sử dụng địa chỉ đơn lẻ của đối tượng std::type_info làm "băm" hợp lý. Do đó, bạn có thể đặt một mã số std::type_info vào std::unordered_map làm khóa.

C++ 11 có cung cấp chức năng băm như vậy không? Việc sử dụng địa chỉ bộ nhớ của std::type_info singleton có phải là một chiến lược băm xấu không?

+2

Nó không phải là một singleton, bằng cách này, nhưng một đối tượng được phân bổ tĩnh. – GManNickG

+0

@GMan: Sự khác biệt là gì? –

+1

Nếu nó là một singleton, sẽ có chính xác một đối tượng 'type_info'. Vì có nhiều loại trong một chương trình, phải có nhiều hơn một đối tượng 'type_info' trong chương trình. –

Trả lời

9

Thực tế là type_info không ít hơn so sánh không phải là vấn đề lớn khi sử dụng nó làm khóa bản đồ vì thực tế là type_info không thể sao chép được. :-)

Trong C++ 03, type_info có chức năng thành viên before() cung cấp thứ tự các đối tượng type_info.

Trong C++ 11, type_infohash_code() hàm thành viên (C++ 11 §18.7.1/7):

size_t hash_code() const throw(); 

Returns: một unspeci giá trị fi ed, ngoại trừ rằng trong vòng một thực hiện đơn của chương trình, nó sẽ trả về cùng một giá trị cho bất kỳ hai đối tượng type_info nào so sánh bằng nhau.

Lưu ý: việc triển khai sẽ trả về các giá trị khác nhau cho hai đối tượng type_info không so sánh bằng nhau.

type_info đối tượng phát sinh từ các nhà điều hành typeid tồn tại cho đến khi kết thúc chương trình, vì vậy nó là an toàn để sử dụng một type_info* như một chìa khóa bản đồ. Tuy nhiên, theo hiểu biết tốt nhất của tôi, không có đảm bảo rằng nếu bạn áp dụng typeid cho hai đối tượng cùng loại, bạn sẽ nhận được hai tham chiếu đến cùng một đối tượng type_info.

Nếu bạn sử dụng type_info* như một chìa khóa bản đồ, tôi muốn sử dụng một so sánh tùy chỉnh mà dereferences các con trỏ và so sánh các đối tượng type_info mình (sử dụng nói trên before() hoặc hash_code() cho đặt hàng).

+0

@ James: D'oh! Có lẽ tôi có thể sử dụng 'std :: type_info *' (vì chỉ có một instance của một class type_info cụ thể?)? –

+0

@Billy: Điều đó cần được an toàn (xem phần chỉnh sửa của tôi để báo trước). –

+0

@James: Điều đó có thể khó khăn vì các đối tượng 'std :: type_info' không cung cấp cách hiệu quả để so sánh bản thân. Có vẻ như nó đã trở lại giải pháp pha chế bia tại nhà cho tôi:/ –

10

Bạn cũng có thể sử dụng type_index, nó giữ an toàn con trỏ đến một type_info, nó có thể sao chép, so sánh và hàm băm được cung cấp cho vùng chứa tiêu chuẩn.

Các vấn đề liên quan