Beste Möglichkeit für C ++ - Typen, sich selbst in einer Liste zu registrieren?

Angenommen, ich habe einige Daten pro Klasse: (AandB.h)

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

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

... und viele, viele weitere Klassen. Und ich möchte etwas machen wie:

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

... für jede Klasse.

Meine Frage lautet: Gibt es eine Möglichkeit, das Erstellen einer Liste von Daten pro Typ zu automatisieren, damit ich nicht jeden Typ in einem großen Block aufzählen muss (wie im obigen Beispiel)?

Sie können dies beispielsweise folgendermaßen tun: (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() );
   }
};

und verwenden Sie dies wie folgt: (AandB.cxx:)

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

Nun, nachdem mein Programm gestartet wurde, kann ich Folgendes sicher tun: (main.cxx)

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

zum Sammeln aller typspezifischen Daten und Registrieren aller Daten in einer großen Liste, um sie später für andere Zwecke zu verwenden.

Das Problem bei diesem Ansatz besteht darin, dass ich ein AutoRegister-Objekt pro Typ hinzufügen muss. (d. h. es ist nicht sehr automatisch und leicht zu vergessen). Und was ist mit Vorlagenklassen? Was ich wirklich gerne hätte, ist die Instanziierung einer Template-Klasse, damit diese Klasse automatisch in der Liste registriert wird. Wenn ich dies tun könnte, müsste der Benutzer der Klasse (und nicht der Autor) nicht daran denken, ein: @ zu erstelle

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

für jede Instanziierung der Vorlagenklasse.

Für FIW gibt es vermutlich keine Lösung.

Antworten auf die Frage(10)

Ihre Antwort auf die Frage