内存分配使用运行时类型信息

时间:2012-09-27 14:24:36

标签: c++ typeid

我在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来分配内存。谁能这样做?它甚至可能吗?我没有任何虚拟功能。

可以通过任何其他方式完成这样的壮举。我不想使用虚函数,因为它对代码矢量化有负面影响。

4 个答案:

答案 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 ++没有反映你运气不好。