Рассмотрим этот псевдокод:
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>
impl, он будет работать... но это не то, чего я хочу... Я хочу, чтобы производный класс определял идентификатор...
Должен ли я вставлять идентификатор и getID() в производный класс? Думаю, в конечном итоге меня интересует некоторый RTTI, чтобы я мог правильно обработать Foo
. Если у кого-то есть лучший образец, я все уши.
EDIT В ответ на некоторые комментарии... Я хотел бы однозначно идентифицировать классы, производные от Foo
, с помощью некоторого идентификатора, чтобы я мог сравнить идентификатор среды выполнения некоторого объекта Foo
с идентификатором определенного класса.
Спасибо!
typeid
илиdynamic_cast
не соответствуют цели? - person Ise Wisteria   schedule 24.03.2011Foo
может быть передан вreceive
, в некоторых случаях переключатель лучше, чем блок if/else, особенно для классов с большой реализациейreceive
. - person Tim Reddy   schedule 24.03.2011