2011-08-22 44 views
9

Tôi muốn tạo một băm cho một lớp dựa trên kiểu dẫn xuất của nó tại thời gian biên dịch. Hôm nay tôi tạo ra nó như:C + + loại id tại thời gian biên dịch

template<class Type> 
class TypeBase 
{ 
public: 
    static const unsigned s_kID; 
}; 

template<class Type> 
const unsigned TypeBase<Type>::s_kID = hash(typeid(Type)); 

nhưng điều này tạo ra (khá cần thiết) chạy mã thời gian khởi tạo (hash (..) chức năng thực hiện một băm đơn giản dựa trên std :: type_info :: name())

Ý tưởng?

+0

Không có nguy cơ bạn gặp phải xung đột băm hoặc có thể đó không phải là vấn đề? –

+0

@Andreas: Khi tạo băm, tôi cũng có một bản đồ với các mục băm. Vì vậy tôi có thể kiểm tra nếu có va chạm. Bên cạnh đó, số lượng lớp học có thể là 20, vì vậy tôi đoán tôi cũng an toàn với điều đó. – Robert

+0

Bạn không thể làm điều gì đó như 'id = ++ someGlobalCounter'? (Tôi nhận ra đây không phải là petformance quan trọng, chỉ tò mò) –

Trả lời

3

Cho mọi thứ khác xảy ra khi khởi động quá trình và cách mã đơn giản và thanh lịch hiện tại của bạn, giả sử bạn không băm một loại gazillion, tôi sẽ để giải pháp hiện tại của bạn chính xác như cũ.

+0

Cảm ơn. Trường hợp tối ưu hóa sớm, eh? ;) – Robert

+0

Thật vậy. Miễn là bạn không có bất kỳ tác động thời gian chạy nào như người dùng phàn nàn rằng ứng dụng mất 150 micro giây quá dài để khởi động, hãy để nguyên trạng thái đó. Và đừng cố gắng thực hiện bất kỳ phép thuật nào để chuyển con trỏ của biến đó thành unsigned, vì điều này sẽ không thể di chuyển được. – PlasmaHH

+0

@robert vâng, tôi có vẻ như vậy. –

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