Рассмотрим этот псевдокод:
class Foo {
public:
virtual int getID() const = 0;
}
template<typename T>
class Blah : public Foo {
public:
T data;
static const int ID; //static ID
int getID() const { return Blah<T>::ID; } //instance returns the ID
}
class Dude : public Blah<int> {
}
int Dude::ID = 10; //I want to define Blah<int>::ID here, but how?
int receive(const Foo& foo) {
if(foo.getID() == Dude::ID) {
cout << "Received a Dude" << endl;
}
}
Этот фрагмент кода не может быть скомпилирован, поскольку ISO C ++ не позволяет идентифицировать идентификатор в шаблоне Blah
как идентификатор в классе Dude
.Я понимаю почему, потому что у меня может быть несколько классов, которые расширяют Blah<int>
.
. Я понимаю, что если поставить template<typename T> int Blah<T>::ID = 10' in the Blah<T>
, подразумевается, что это будет работать ... но это не то, что я хочу ... Яхочу, чтобы производный класс определял идентификатор ...
Нужно ли вставлять идентификатор и getID () в производный класс?Я предполагаю, что в конечном итоге мне интересны некоторые RTTI, чтобы я мог обработать Foo
соответствующим образом.Если у кого-то есть лучшая модель, у меня все уши.
РЕДАКТИРОВАТЬ В ответ на некоторые комментарии ... Я хотел бы однозначно определить классы, которые происходят от Foo
черезнекоторый идентификатор, чтобы я мог сравнить идентификатор времени выполнения некоторого Foo
объекта с определенным идентификатором класса.
Спасибо!