Stefano Sabatini wrote:
[snip]
Yes, I tried it and it is indeed what I need. Only what I also need
would be a static method which returns the total number of objects
already registered.
Objects or classes?
Assuming classes, this poses an interesting problem. Here are two attempts:
a)
class reg_base {
protected:
static
unsigned int &
the_count ( void ) {
static unsigned int c = 0;
return ( c );
}
static
unsigned int count ( void ) {
return ( the_count() ++ );
}
public:
static
unsigned int num_classes ( void ) {
return ( the_count() );
}
virtual
unsigned int get_id ( void ) const = 0;
virtual
~reg_base ( void ) {}
};
template < typename D >
class reg : public reg_base {
static unsigned int const the_id;
public:
unsigned int get_id ( void ) const {
return ( the_id );
}
static
unsigned int id ( void ) {
return ( the_id );
}
virtual
~reg ( void ) {}
};
template < typename D >
unsigned int const reg<D>::the_id = reg<D>::reg_base::count();
struct X : public reg<X> {};
struct Y : public reg<Y> {};
struct Z : public reg<Z> {};
#include <iostream>
int main ( void ) {
std::cout << "Classes: " << reg_base::num_classes() << '\n';
X x;
Y y1;
Y y2;
reg_base * px = new X ();
reg_base * py = 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 << "X " << px->get_id() << '\n';
std::cout << "Y " << py->get_id() << '\n';
std::cout << "X " << X::id() << '\n';
std::cout << "Y " << Y::id() << '\n';
delete ( px );
delete ( py );
}
This one does not count the class Z. Honestly, I don't know the reason.
base class as well), since it isn't used anywhere in the program. Built