Heim >Backend-Entwicklung >C++ >Wie kann ich C-Objekte aus Klassennamenzeichenfolgen instanziieren?
Objektinstanziierung aus Klassennamen-Strings
In C ist es ohne explizite Zuordnung nicht möglich, ein Objekt aus einem String zu instanziieren, der den Klassennamen enthält . Diese Einschränkung ergibt sich aus der statischen Natur von C, wo Typen zur Kompilierungszeit bekannt sein müssen.
Option 1: Manuelle Zuordnung mithilfe von Vorlagen
Sie können eine Vorlagenfunktion erstellen für jede Klasse, die Sie instanziieren möchten, und eine Karte, um Klassennamen mit den entsprechenden Vorlagenfunktionen zu verknüpfen. Zum Beispiel:
template<typename T> Base* createInstance() { return new T; } map_type map; map["DerivedA"] = &createInstance<DerivedA>; map["DerivedB"] = &createInstance<DerivedB>;
Um ein Objekt zu instanziieren, verwenden Sie:
return map[some_string]();
Option 2: Laufzeittypregistrierung
Sie können Klassen haben Registrieren Sie sich mit einem statischen Mechanismus und rufen Sie dann Instanzen dynamisch ab. Dazu gehört die Verwendung einer Singleton-Map zum Speichern von Klassennamen-Funktions-Zuordnungen. Hier ist ein Beispiel:
struct BaseFactory { static Base * createInstance(std::string const& s) { auto it = getMap()->find(s); return it != getMap()->end() ? it->second() : nullptr; } static std::map<std::string, std::function<Base*()>> * getMap() { if (!map) { map = new std::map<std::string, std::function<Base*()>>; } return map; } private: static std::map<std::string, std::function<Base*()>> * map; }; template<typename T> struct DerivedRegister : BaseFactory { DerivedRegister(std::string const& s) { getMap()->insert({s, &createInstance<T>}); } }; class DerivedB { private: static DerivedRegister<DerivedB> reg("DerivedB"); };
Diese Methode ermöglicht die automatische Registrierung von Klassen zur Laufzeit.
Option 3: Boost-Variante
Wenn ja Für nicht verwandte Klassen ohne gemeinsame Basisklasse können Sie die Boost-Variantenbibliothek verwenden:
typedef boost::variant<Foo, Bar, Baz> variant_type; template<typename T> variant_type createInstance() { return variant_type(T()); } typedef std::map<std::string, variant_type (*)()> map_type;
Diese Technik ermöglicht die Instanziierung von verschiedene Typen aus einer einzelnen Zeichenfolge.
Zusammenfassend lässt sich sagen, dass in C ein integrierter Mechanismus für die Objektinstanziierung aus Klassennamenzeichenfolgen fehlt. Mithilfe von Vorlagen, Laufzeitregistrierung oder der Boost-Variantenbibliothek können Sie jedoch eine ähnliche Funktionalität erreichen.
Das obige ist der detaillierte Inhalt vonWie kann ich C-Objekte aus Klassennamenzeichenfolgen instanziieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!