распределение памяти с использованием информации о типе среды выполнения

Я узнал об информации о типах во время выполнения в 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. Может ли кто-нибудь сделать это? Это вообще возможно. У меня нет никаких виртуальных функций.

Может ли такой подвиг быть достигнут любым другим способом. Я не хочу использовать виртуальные функции, так как это отрицательно влияет на векторизацию кода.

1

Решение

Нет, это невозможно. То, что вы ищете, это завод.

Вот пример такой фабрики. Предположим, у вас есть эти типы:

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));
0

Другие решения

В вашем коде s это не тип, это ссылка на объект.
Тип является синтаксической конструкцией, которая существует только во время компиляции, и когда программа компилируется в собственный код, большинство, если не вся информация о типе теряется!

0

Если у вас нет виртуальных функций, у вас нет RTTI, поэтому typeid(x).name() всегда Complex, и вы можете просто написать

Complex *tp = new Complex[10];
0

Если код был в шаблонной функции, вы могли бы сделать что-то подобное. Но, посмотрев документы для type_info, я не думаю, что это сработает так, как вы хотите.

http://www.cplusplus.com/reference/std/typeinfo/type_info/

Теперь C # может делать то, что вы хотите, используя отражение. Но так как ваш родной C ++ не имеет отражения, вам не повезло.

-1
По вопросам рекламы [email protected]