Heterogene Speicherung variadischer Klassenparameter-Membervariablen

Ich habe eine variable Klassenvorlage, mit der eine Klasse der obersten Ebene für eine variable Anzahl von Klassen erstellt wird. Jede Klasse, die in die Klasse der obersten Ebene aufgenommen werden soll, wird von einer Basisklasse abgeleitet, da für sie gemeinsame Funktionen vorhanden sind. Ich weiß nicht, wie die abgeleiteten Klassen am besten in der übergeordneten Klasse gespeichert werden können, kann aber trotzdem auf die gesamte Funktionalität der abgeleiteten Klasse zugreifen.

Wenn ich die variadischen Argumente in einem Vektor speichere, werden sie alle als Basisklasse gespeichert und ich kann nicht auf die abgeleitete Funktionalität zugreifen. Wenn ich sie in einem Tupel speichere, kann ich nicht herausfinden, wie ich nach abgeleitetem Typ auf die Funktionen zugreifen kann. Wenn ich versuche, auf sie zuzugreifenwie hier auf SO diskutiert dann ist make_unique nicht verfügbar (C ++ 14?).

Daher möchte ich Folgendes tun:

class BaseElement {
public:
    virtual int polymorphicFunction() {return 0;};
};

class DerivedElement1 : public BaseElement {
public:
    virtual int polymorphicFunction() {return 1;};
}

class DerivedElement2 : public BaseElement {
public:
    virtual int polymorphicFunction() {return 2;};
}

template<typename... systems>   // systems will always be of derived class of BaseElement
class System {
    System() : subsystems(systems{}...) {} ;  // all variadic elements stored in tuple
    // tuple used below, the system elements don't need to be stored in a container, I just want to access them 
    // I'd be happy to use a vector or access them directly as a member variable
    // provided that I can access the derived class.  I can't use RTTI.
    const std::tuple<systems...> subSystems;

    // pointer or reference, I don't mind, but pd1/2 will always exist, 
    // (but perhaps be NULL), even if there is no derived element passed to the template parameter
    DerivedElement1 *pd1; 
    DerivedElement2 *pd2;
};

//Desired usage
System<DerivedElement1> sys;  // sys->pd1 == &derivedElement1WithinTuple, sys->pd2 == NULL
System<DerivedElement2> sys;  // sys->pd2 == &derivedElement2WithinTuple, sys->pd2 == NULL
System<DerivedElement1, DerivedElement2> sys;  // sys->pd1 == &derivedElement1WithinTuple, sys->pd1 == &derivedElement1WithinTuple

Hat jemand Vorschläge, wie ich das bitte erreichen könnte?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage