1

我开始了解 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

4 回答 4

0

不,这是不可能的。你要找的是工厂

这是这样一个工厂的一个例子。假设您有以下类型:

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));
于 2012-09-27T14:32:14.177 回答
0

在您的代码s中不是类型,它是对对象的引用。类型是句法结构,仅在编译期间存在,当程序编译为本机代码时,即使不是全部,大部分类型信息都会丢失!

于 2012-09-27T14:32:32.203 回答
0

如果你没有任何虚函数,你就没有 RTTI,typeid(x).name()总是这样Complex,你可以简单地写

Complex *tp = new Complex[10];
于 2012-09-27T14:42:20.643 回答
-1

如果代码在模板函数中,您可能会做类似的事情。但是在查看了 type_info 的文档之后,我认为它不会满足您的需求。

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

现在 C# 可以使用反射来做你想做的事。但是由于您的本机 C++ 没有反射,因此您很不走运。

于 2012-09-27T14:36:23.230 回答