Я думаю, что вам нужен «контейнер», т. Е. Структура, в которой есть только указатели:
struct Container{
Base* derivedAdata_;
Base* derivedBdata_;
...
};
Теперь каждый из известных вам членов относится к определенному типу (например, DerivedA, DerivedB и т. Д.).), чтобы потом можно было их понижать.
Но сначала вы получаете данные (в произвольном порядке), но со строковым именем, поэтому у вас должна быть карта:
std::map<std::string, Base* Container::*>
И, должно быть, вы уже заполнили карту:
myMap["DerivedA"] = &Container::derivedAdata;
...
Теперь данные поступают, и вы начинаете заполнять контейнер:
instance.*(myMap[key]) = factory(key, data);
myMap[key]
выбирает правый элемент контейнера и factory(key,data)
создает экземпляры.
кстати, вы можете в любом случае иметь карту в качестве контейнера: std::map<std::string, Base*>