Gibt es eine Möglichkeit, Objekte aus einer Zeichenfolge mit ihrem Klassennamen zu instanziieren?

Habe ich eine Datei: Base.h

class Base;
class DerivedA : public Base;
class DerivedB : public Base;

/*etc...*/

und eine weitere Datei: BaseFactory.h

#include "Base.h"

class BaseFactory
{
public:
  BaseFactory(const string &sClassName){msClassName = sClassName;};

  Base * Create()
  {
    if(msClassName == "DerivedA")
    {
      return new DerivedA();
    }
    else if(msClassName == "DerivedB")
    {
      return new DerivedB();
    }
    else if(/*etc...*/)
    {
      /*etc...*/
    }
  };
private:
  string msClassName;
};

/*etc.*/

Gibt es eine Möglichkeit, irgendwie wandelt diese Zeichenfolge in eine tatsächliche Typ (Klasse), so dass BaseFactory nicht haben, zu wissen, alle möglichen Abgeleiteten Klassen, und haben, wenn() für jedes von Ihnen? Kann ich produzieren eine Klasse von dieser Schnur?

Ich denke, das kann man in C# durch Reflexion. Gibt es etwas ähnliches in C++?

Kommentar zu dem Problem
seine teilweise möglich mit C++0x und variadic templates.. Kommentarautor: smerlin

InformationsquelleAutor der Frage Gal Goldman | 2009-02-24

Schreibe einen Kommentar