#include <iostream>
#include <functional>
#include <unordered_map>
#include <vector>
#include <memory>
// Gemeinsame Basisklasse
class Base {
public:
// Virtueller Destruktor
virtual ~Base () {}
virtual void test () = 0;
};
// Abgeleitete Klassen
class Derived1 : public Base {
public:
virtual ~Derived1 () { std::cout << "Derived1::~Derived1\n"; }
virtual void test () { std::cout << "Derived1::test\n"; }
};
class Derived2 : public Base {
public:
virtual ~Derived2 () { std::cout << "Derived2::~Derived2\n"; }
virtual void test () { std::cout << "Derived2::test\n"; }
};
// Zuordnung (map) ID->Factory-Funktion
std::unordered_map<int, std::function<std::unique_ptr<Base> ()>> factories {
{ 1 , []() { return std::unique_ptr<Base> (new Derived1); }},
{ 42, []() { return std::unique_ptr<Base> (new Derived2); }}};
std::vector<std::unique_ptr<Base>> getObjects (std::vector<int> input) {
// Erzeugte Objekte
std::vector<std::unique_ptr<Base>> objects;
for (int i : input) {
// Suche Factory-Funktion...
auto f = factories.find (i);
if (f != factories.end ())
// Rufe Factory-Funktion auf, erstelle Objekt, speichere in "objects"
objects.push_back ((f->second) ());
else
std::cout << "Unbekannte ID " << i << std::endl;
}
return objects;
}
int main () {
// Angenommen, das hier ist zur kompilezeit nicht bekannt (Dateieingabe o.ä.); enthält Liste an ID's, von denen Objekte angelegt werden sollen
std::vector<int> input { 42, 1, 1, 42, 3, 1 };
auto objects = getObjects (std::move (input));
// Rufe virtuelle Funktion auf Objekten auf
for (auto& obj : objects)
obj->test ();
// unique_ptr löscht Objekte hier
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxtZW1vcnk+CgovLyBHZW1laW5zYW1lIEJhc2lza2xhc3NlCmNsYXNzIEJhc2UgewogIHB1YmxpYzoKICAJLy8gVmlydHVlbGxlciBEZXN0cnVrdG9yCiAgCXZpcnR1YWwgfkJhc2UgKCkge30KICAgIHZpcnR1YWwgdm9pZCB0ZXN0ICgpID0gMDsKfTsKLy8gQWJnZWxlaXRldGUgS2xhc3NlbgpjbGFzcyBEZXJpdmVkMSA6IHB1YmxpYyBCYXNlIHsKICBwdWJsaWM6CiAgCXZpcnR1YWwgfkRlcml2ZWQxICgpIHsgc3RkOjpjb3V0IDw8ICJEZXJpdmVkMTo6fkRlcml2ZWQxXG4iOyB9CiAgICB2aXJ0dWFsIHZvaWQgdGVzdCAoKSB7IHN0ZDo6Y291dCA8PCAiRGVyaXZlZDE6OnRlc3RcbiI7IH0KfTsKY2xhc3MgRGVyaXZlZDIgOiBwdWJsaWMgQmFzZSB7CiAgcHVibGljOgogIAl2aXJ0dWFsIH5EZXJpdmVkMiAoKSB7IHN0ZDo6Y291dCA8PCAiRGVyaXZlZDI6On5EZXJpdmVkMlxuIjsgfQogICAgdmlydHVhbCB2b2lkIHRlc3QgKCkgeyBzdGQ6OmNvdXQgPDwgIkRlcml2ZWQyOjp0ZXN0XG4iOyB9Cn07CgovLyBadW9yZG51bmcgKG1hcCkgSUQtPkZhY3RvcnktRnVua3Rpb24Kc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3RkOjpmdW5jdGlvbjxzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4gKCk+PiBmYWN0b3JpZXMgewoJeyAxICwgW10oKSB7IHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4gKG5ldyBEZXJpdmVkMSk7IH19LAoJeyA0MiwgW10oKSB7IHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QmFzZT4gKG5ldyBEZXJpdmVkMik7IH19fTsKCnN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxCYXNlPj4gZ2V0T2JqZWN0cyAoc3RkOjp2ZWN0b3I8aW50PiBpbnB1dCkgewoJLy8gRXJ6ZXVndGUgT2JqZWt0ZQoJc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEJhc2U+PiBvYmplY3RzOwoJCglmb3IgKGludCBpIDogaW5wdXQpIHsKCQkvLyBTdWNoZSBGYWN0b3J5LUZ1bmt0aW9uLi4uCgkJYXV0byBmID0gZmFjdG9yaWVzLmZpbmQgKGkpOwoJCWlmIChmICE9IGZhY3Rvcmllcy5lbmQgKCkpCgkJCS8vIFJ1ZmUgRmFjdG9yeS1GdW5rdGlvbiBhdWYsIGVyc3RlbGxlIE9iamVrdCwgc3BlaWNoZXJlIGluICJvYmplY3RzIgoJCQlvYmplY3RzLnB1c2hfYmFjayAoKGYtPnNlY29uZCkgKCkpOwoJCWVsc2UKCQkJc3RkOjpjb3V0IDw8ICJVbmJla2FubnRlIElEICIgPDwgaSA8PCBzdGQ6OmVuZGw7Cgl9CglyZXR1cm4gb2JqZWN0czsKfQoKCmludCBtYWluICgpIHsKCS8vIEFuZ2Vub21tZW4sIGRhcyBoaWVyIGlzdCB6dXIga29tcGlsZXplaXQgbmljaHQgYmVrYW5udCAoRGF0ZWllaW5nYWJlIG8uw6QuKTsgZW50aMOkbHQgTGlzdGUgYW4gSUQncywgdm9uIGRlbmVuIE9iamVrdGUgYW5nZWxlZ3Qgd2VyZGVuIHNvbGxlbgoJc3RkOjp2ZWN0b3I8aW50PiBpbnB1dCB7IDQyLCAxLCAxLCA0MiwgMywgMSB9OwoJYXV0byBvYmplY3RzID0gZ2V0T2JqZWN0cyAoc3RkOjptb3ZlIChpbnB1dCkpOwoJCgkvLyBSdWZlIHZpcnR1ZWxsZSBGdW5rdGlvbiBhdWYgT2JqZWt0ZW4gYXVmCglmb3IgKGF1dG8mIG9iaiA6IG9iamVjdHMpCgkJb2JqLT50ZXN0ICgpOwoJCQoJLy8gdW5pcXVlX3B0ciBsw7ZzY2h0IE9iamVrdGUgaGllcgp9Cgo=