2011-12-30 30 views
14

Theo cplusplus.com, các std::type_info::before() chức năng ...`type_info :: before` hữu ích cho mục đích gì?

Returns true nếu loại trước các loại RHS theo thứ tự đối chiếu.
Thứ tự đối chiếu chỉ là thứ tự nội bộ được lưu giữ bởi một triển khai cụ thể và không nhất thiết liên quan đến quan hệ thừa kế hoặc thứ tự khai báo.

Vì vậy, điều gì hữu ích?

Trả lời

24

Cân nhắc bạn muốn đặt các đối tượng type_info làm khóa vào map<type_info*, value>. type_info không được định nghĩa operator <, vì vậy bạn phải cung cấp bộ so sánh của riêng bạn. Điều duy nhất mà được đảm bảo để làm việc từ giao diện type_infobefore() chức năng, vì không địa chỉ của type_info lẫn name() phải là duy nhất:

struct compare { 
    bool operator()(const type_info* a, const type_info* b) const { 
     return a->before(*b); 
    } 
}; 

std::map<const type_info*, std::string, compare> m; 

void f() { 
    m[&typeid(int)] = "Hello world"; 
} 
+1

"*' type_info' không có toán tử '<định nghĩa, vì vậy bạn phải cung cấp trình so sánh của riêng bạn. *" 'Std :: less <>' ('std :: map <>' 's mặc định so sánh) hoạt động cho ** tất cả ** con trỏ, bạn chỉ nhận được thứ tự địa chỉ thay vì thứ tự đối chiếu. – ildjarn

+6

@ildjarn: bạn hiểu sai vấn đề. Tiêu chuẩn không đảm bảo rằng nhiều nhất một 'loại_info' cho mỗi loại tồn tại. Infact thường gặp phải * nhiều hơn một 'typeinfo' * được tạo cho cùng một loại. Trường hợp tầm thường nhất là trong bối cảnh các thư viện liên kết động, như Dietmar nói. – ybungalobill

+1

@ildjarn Đọc lại báo giá của bạn. Nó nói về 'toán tử <' của 'type_info', nhưng bạn tranh luận về tính hợp lệ của việc so sánh con trỏ với' type_info', ngụ ý rằng câu được trích dẫn là bằng cách nào đó sai. Nhưng không phải vì tôi không nói gì về việc so sánh con trỏ. Vậy tại sao bạn lại viết những bình luận không liên quan? – ybungalobill

1

Nó đưa ra một yêu cầu.

Điều đó là bắt buộc nếu bạn muốn lưu trữ giá trị trong một số vùng chứa, như std :: map.

4

này rất hữu ích để xác định một trật tự trên typeinfo đối tượng, ví dụ để đưa chúng vào một std :: map. Câu hỏi tiếp theo rõ ràng là: tại sao nó không được đánh vần nhà điều hành <()? Tôi không biết câu trả lời cho câu hỏi này.

+2

"* Câu hỏi tiếp theo rõ ràng là: tại sao nó không được đánh vần toán tử <()? *" Làm thế nào để xác định một toán tử '' cho một kiểu con trỏ? – ildjarn

+0

'type_info' không có hàm tạo bản sao hoặc toán tử gán bản sao, vì vậy nó không thể được lưu trữ trực tiếp vào vùng chứa. Và tất nhiên, loại khóa của một thùng chứa liên kết không thể là một tham chiếu, do đó, tùy chọn còn lại duy nhất là lưu trữ một 'type_info *', mà không thể cung cấp một toán tử ''. Có lẽ điều hợp lý để làm là chuyên 'std :: less '. – ildjarn

+1

@ildjarn: Câu hỏi của Dietmar là 'tại sao 'type_info' có' before() 'nhưng không có' toán tử <''.Mặc dù những gì bạn nói là chính xác, nhưng nó không trả lời câu hỏi của anh ấy. Ví dụ. tại sao tôi không thể viết 'typeid (int) ybungalobill

1

Hãy nghĩ về nhà cung cấp dịch vụ nhỏ hơn (<) cho các đối tượng type_info. Nếu bạn muốn lưu trữ trong bộ sưu tập theo thứ tự - một bộ bản đồ như vậy - bạn có thể sử dụng nó để tạo một bộ so sánh phù hợp. Đó là một cách đáng tin cậy và ưa thích, trái với, nói, sử dụng tên của loại có thể không phải là duy nhất.

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