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 に答える