Вы не можете сделать это простым способом, но могут быть некоторые обходные пути. Я еще не в C++ 11 (моя IDE не поддерживает его, и я не могу изменить его ATM), но для старого C++ вы можете использовать typeid(a).name()
, где a
- это переменная. Вы можете сохранить результат функции внутри vector
, а затем создать переменные, используя конструкцию if-else.
Или - если ты собираешься только хочешь инициализировать переменные ваши классы, а затем вывести их из Base
класса, который имеет функцию, которая возвращает идентификатор типа класса:
class Base{
int classId;
public:
Base(){classID=0;};
virtual int myType(){return classID;};
};
class Derived1: public Base{
public:
Derived1(){classID=1;};
и так далее. Тогда вы просто создать объекты, используя switch
заявление:
vector<int> types;
// Populate the vector somewhere here
for(unsigned int i=0;i<types.size();i++){
Base* newObject;
switch(types[i].myType()){
case 0:
newObject = new Base;
break;
case 1:
newObject = new Derived;
break;
default:
newObject = 0;
}
}
Во время компиляции? [Повышение :: MPL :: вектор] (http://www.boost.org/doc/libs/1_55_0/libs/mpl/doc/refmanual/vector.html). Во время выполнения? Неа. –
Вам ответили на ваш [последний вопрос] (http://stackoverflow.com/questions/20639747/is-it-possible-to-iterate-over-all-elements-in-a-struct-or- класс), что это невозможно. – Praetorian
Если вы хотите отражения, вы должны использовать язык с отражением. C++ - нет. У него также нет типа – Cornstalks