¿La mejor manera de que los tipos C ++ se registren automáticamente en una lista?

Supongamos que tengo algunos datos por clase: (AandB.h)

class A
{
public:
   static Persister* getPersister();
}

class B
{
public:
   static Persister* getPersister();
}

... y muchísimas más clases. Y quiero hacer algo como:

persistenceSystem::registerPersistableType( A::getPersister() );
persistenceSystem::registerPersistableType( B::getPersister() );
...
persistenceSystem::registerPersistableType( Z::getPersister() );

... para cada clase.

Mi pregunta es: ¿hay alguna manera de automatizar la creación de una lista de datos por tipo para que no tenga que enumerar cada tipo en un gran fragmento (como en el ejemplo anterior)?

Por ejemplo, una forma de hacerlo es: (AutoRegister.h)

struct AutoRegisterBase
{
   virtual ~AutoRegisterBase() {}
   virtual void registerPersist() = 0;
   static AutoRegisterBase*& getHead()
   {
      static AutoRegisterBase* head= NULL;
      return head;
   }

   AutoRegisterBase* next;
};

template <typename T>
struct AutoRegister : public AutoRegisterBase
{
   AutoRegister() { next = getHead(); getHead() = this; }

   virtual void registerPersist()
   {
       persistenceSystem::registerPersistableType( T::getPersister() );
   }
};

y use esto de la siguiente manera: (AandB.cxx:)

static AutoRegister<A> auto_a;
static AutoRegister<B> auto_b;

Ahora, después de que mi programa se inicia, puedo hacer con seguridad: (main.cxx)

int main( int, char ** )
{
    AutoRegisterBase* p = getHead();
    while ( p )
    {
        p->registerPersist();
        p = p->next;
    }
    ...
}

para recopilar cada pieza de datos por tipo y registrarlos en una lista grande en algún lugar para usos desviados posteriores.

El problema con este enfoque es que requiere que agregue un objeto AutoRegister en algún lugar por tipo. (es decir, no es muy automático y es fácil de olvidar). ¿Y qué hay de las clases de plantilla? Lo que realmente me gustaría es que la creación de instancias de una clase de plantilla de alguna manera haga que esa clase se registre automáticamente en la lista. Si pudiera hacer esto, evitaría tener que tener el usuario de la clase (en lugar del autor) para recordar crear un:

static AutoRegister< SomeClass<X1> > auto_X1;
static AutoRegister< SomeClass<X2> > auto_X2;
...
etc....

para cada instancia de clase de plantilla.

Para FIW, sospecho que no hay solución para esto.

Respuestas a la pregunta(5)

Su respuesta a la pregunta