Я узнал об информации о типах во время выполнения в c ++. Это может быть достигнуто с
Ключевое слово typeid в C ++.
int main()
{
//these two where user-defined class
Complex x;
Point3D y;
const type_info& s = typeid(x);
cout<<typeid(y).name()<<endl; //works...(1)
cout<<s.name()<<endl; //works...(2)
Complex * tp = new s[10]; //does not work...(3)
}
Как отмечено в коде, мне удалось распечатать типы объектов данных, как в (1) и (2).
Теперь я хочу выделить память, используя type_info / typeid. Может ли кто-нибудь сделать это? Это вообще возможно. У меня нет никаких виртуальных функций.
Может ли такой подвиг быть достигнут любым другим способом. Я не хочу использовать виртуальные функции, так как это отрицательно влияет на векторизацию кода.
Нет, это невозможно. То, что вы ищете, это завод.
Вот пример такой фабрики. Предположим, у вас есть эти типы:
class point_t
{
};
class complex_t : public point_t
{
};
class point3d_t : public point_t
{
};
Вы можете определить следующую фабрику:
typedef point_t* (*makeptr)();
class point_factory
{
static point_t* make_complex()
{
return new complex_t();
}
static point_t* make_point3d()
{
return new point3d_t();
}
static std::map<std::string, makeptr> _map;
public:
static void init()
{
_map.insert(make_pair(typeid(complex_t).name(), &point_factory::make_complex));
_map.insert(make_pair(typeid(point3d_t).name(), &point_factory::make_point3d));
}
static point_t* make_point(const type_info& type)
{
std::map<std::string, makeptr>::iterator pos = _map.find(type.name());
if(pos != _map.end())
return (*(pos->second))();
return NULL;
}
};
std::map<std::string, makeptr> point_factory::_map;
И используйте это так:
point_factory::init();
point_t* p = point_factory::make_point(typeid(point3d_t));
В вашем коде s
это не тип, это ссылка на объект.
Тип является синтаксической конструкцией, которая существует только во время компиляции, и когда программа компилируется в собственный код, большинство, если не вся информация о типе теряется!
Если у вас нет виртуальных функций, у вас нет RTTI, поэтому typeid(x).name()
всегда Complex
, и вы можете просто написать
Complex *tp = new Complex[10];
Если код был в шаблонной функции, вы могли бы сделать что-то подобное. Но, посмотрев документы для type_info, я не думаю, что это сработает так, как вы хотите.
http://www.cplusplus.com/reference/std/typeinfo/type_info/
Теперь C # может делать то, что вы хотите, используя отражение. Но так как ваш родной C ++ не имеет отражения, вам не повезло.