Như Alf nói, điều này không cần thiết. typeid
đã cung cấp mã định danh lớp duy nhất, mặc dù số nhận dạng không phải là số nguyên. Chỉ cần cho cười, nếu tôi cho phép để thư giãn "lớp cơ sở chung" điều kiện sau đó:
inline unsigned int counter() {
static unsigned int count = 0;
return ++count;
}
struct BaseClass {
virtual unsigned int GetID() = 0;
virtual ~BaseClass() {}
};
template <typename D>
struct IntermediateClass : BaseClass {
virtual unsigned int GetID() {
static unsigned int thisid = counter();
return thisid;
}
};
// usage
struct Derived : IntermediateClass<Derived> {
...
};
Bạn sẽ cần phải thêm thread-an toàn trong counter
nếu nó được sử dụng trong các chương trình đa luồng.
Rõ ràng ID chỉ là duy nhất trong một lần chạy chương trình nhất định. Nếu bạn có rất nhiều nhà xây dựng với các chữ ký khác nhau cho các lớp khác nhau, vì bạn cần chèn lớp trung gian giữa mỗi lớp dẫn xuất và lớp cơ sở trực tiếp của nó. Nhưng bạn luôn có thể giải cứu tất cả những gì như sau:
inline unsigned int counter() {
static unsigned int count = 0;
return ++count;
}
struct BaseClass {
virtual unsigned int GetID() = 0;
virtual ~BaseClass() {}
};
template <typename D>
unsigned int ThisID(const D *) {
static unsigned int thisid = counter();
return thisid;
}
// usage
struct Derived : BaseClass {
// this single line pasted in each derived class
virtual unsigned int GetID() { return ThisID(this); }
...
};
Tôi đoán có một "cơ hội" cho một tính năng ngôn ngữ mới tại đây: một hàm ảo được định nghĩa trong lớp cơ sở như một mẫu chức năng với một " typename "tham số mẫu và được tự động ghi đè trong mỗi lớp dẫn xuất bằng cách sử dụng lớp dẫn xuất đó làm đối số mẫu. cú pháp tưởng tượng, vì chức năng mẫu ảo là bất hợp pháp:
struct BaseClass {
template <typename Derived>
virtual unsigned int GetID() {
static unsigned int thisid = counter();
return thisid;
}
virtual ~BaseClass() {}
};
cứng để biện minh cho một tính năng ngôn ngữ trên cơ sở muốn tái thực hiện RTTI mình, tâm trí ...
Nguồn
2010-11-26 02:12:32
ID phải là int hoặc có thể là bất kỳ loại duy nhất nào, ví dụ: cái được trả về bởi typeid. Là BaseClass Polymorphic của bạn? – Chubsdad
Lớp cơ sở của tôi IS đa hình, nhưng do tôi không có khả năng tìm được giải thích rõ ràng và kỹ lưỡng về bản chất chính xác của chi phí đi kèm với RTTI (cả về hiệu năng lẫn trí nhớ), tôi đang cố gắng tránh nó hoàn toàn . – Dan