Re: How to make every derived class to return a different int
Stefano Sabatini wrote:
Hi all,
I'm facing this design problem.
I have a table which defines the behaviour of an Object in a given
state according to the type of event it is receiving.
So for each couple event,state I want I set in the table a different
handler.
My trivial implementation make use of defines (but I could have used
an enum as well).
So I have:
#define EVT_FOO 0
#define EVT_BAR 1
...
#define EVT_FOOBAR N
Then I define for each event a virtual GetType() which returns the
event type.
This is ugly and awkward, since everytime I add an event I have to
update the enum/list of defines, while I would like to be able to
automatically get a different integer for every derived class of
Event.
Mayeb I could get this result with some kind of run-time registration
mechanism.
What about something like this:
unsigned int
count ( void ) {
static unsigned int c = 0;
return ( c++ );
}
struct reg_base {
virtual
unsigned int get_id ( void ) = 0;
};
template < typename D >
class reg : public reg_base {
static unsigned int const id;
public:
unsigned int get_id ( void ) {
return ( id );
}
};
template < typename D >
unsigned int const reg<D>::id = count();
struct X : public reg<X> {};
struct Y : public reg<Y> {};
#include <iostream>
int main ( void ) {
X x;
Y y1;
Y y2;
reg_base * p = new Y ();
std::cout << "X " << x.get_id() << '\n';
std::cout << "Y " << y1.get_id() << '\n';
std::cout << "Y " << y2.get_id() << '\n';
std::cout << "Y " << p->get_id() << '\n';
}
You could also add a static method that yields the id of a type.
I think this problem should be quite common, so I thought maybe
someone can suggest a better design than that which requires the
enum/defines list.
Best
Kai-Uwe Bux