Almacenamiento heterogéneo de variables miembro de parámetro de clase variable

Tengo una plantilla de clase variable que se usa para crear una clase de nivel superior para un número variable de clases. Cada clase que debe ir en la clase de nivel superior se deriva de una clase base, ya que existe una funcionalidad común para ellos. No sé la mejor manera de almacenar las clases derivadas en la clase principal, pero aún así puedo acceder a la funcionalidad completa de la clase derivada.

Si almaceno los argumentos variables en un vector, todos se almacenarán como una clase base y no puedo acceder a la funcionalidad derivada. Si los guardo en una tupla, no puedo averiguar cómo acceder a las funciones por tipo derivado. Si trato de acceder a elloscomo se discutió aquí en SO entonces make_unique no está disponible (C ++ 14?).

Entonces, quiero hacer lo siguiente:

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

¿Alguien tiene alguna sugerencia sobre cómo podría lograr esto, por favor?

Respuestas a la pregunta(1)

Su respuesta a la pregunta