我在c ++中了解了运行时类型信息。这可以通过以下方式实现 c ++中的typeid关键字。
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来分配内存。谁能这样做?它甚至可能吗?我没有任何虚拟功能。
可以通过任何其他方式完成这样的壮举。我不想使用虚函数,因为它对代码矢量化有负面影响。
答案 0 :(得分:0)
不,这是不可能的。您要找的是factory。
以下是此类工厂的示例。假设您有以下类型:
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));
答案 1 :(得分:0)
在您的代码中s
不是类型,它是对象的引用。
类型是语法结构,仅在编译期间存在,当程序编译为本机代码时,大多数(如果不是全部)类型信息都会丢失!
答案 2 :(得分:0)
如果您没有任何虚拟功能,则表示您没有RTTI,因此typeid(x).name()
始终为Complex
,您只需编写
Complex *tp = new Complex[10];
答案 3 :(得分:-1)
如果代码是模板化函数,你可能会做类似的事情。但在查看了type_info的文档之后,我认为它不适用于你想要的东西。
http://www.cplusplus.com/reference/std/typeinfo/type_info/
现在C#可以使用反射做你想做的事。但是,由于你原生的C ++没有反映你运气不好。