1

テキスト ファイルから型を読み取り、そのインスタンスを作成しようとしています。例えば

class MyType {
    public:
          MyType() {}
          ~MyType() {}     
};

char* type = "MyType";
type object = type(); 

これが正しくないことはわかっていますが、私がやろうとしていることをうまく説明していると思います。それを行う方法があるかどうか、またどのように行うかを尋ねています。タイプを文字列に変換する方法があることは知っていますtypeid(Type).name();が、これを逆にする方法はありますか? 文字列を型に変換することを意味します。

読んでくれてありがとう :)。

編集:それでもわからない場合。私が望むことは、このようにC#で行うことができます

var myObj = Activator.CreateInstance(Type.GetType(namespaceName + className));
4

2 に答える 2

3

デザインパターンファクトリーを使用する必要があります

ソースコードが必要な以下の人のために、クイックアンドダーティファクトリがあります。これは c++11 を使用し、const-correct ではなく、作成関数によってすべて同じである限り、コンストラクターの引数の基本的なサポートを備えています。

#include <iostream>
#include <functional>
#include <memory>
#include <map>

template<class key,class Base,class ...Args> class Factory
{
  using creator = std::function<std::unique_ptr<Base>(Args...)>;
  std::map<key,creator> m;  
public:
  void registerF(key s,creator c)
    {
      m[s]=c;
    }

  std::unique_ptr<Base> operator()(key s,Args... a) 
    {
      return m[s](a...);
    }
};

struct A{virtual void foo()=0;};
struct B1 : A{virtual void foo(){std::cout<<"B1"<<std::endl;}};
struct B2 : A{virtual void foo(){std::cout<<"B1"<<std::endl;}};

template <class T> std::unique_ptr<T> creater()
{
  return std::unique_ptr<T>(new T());
}

int main() {
  Factory<std::string,A> f;
  f.registerF("B1",&creater<B1>);
  f.registerF("B2",&creater<B2>);
  auto p=f("B1");
  p->foo();

  return 0;
}

編集: 登録されていない文字列でクラスをインスタンス化しようとすると、マップの operator[] が空の std::function を呼び出して呼び出すため、例外 bad_function_call が発生します。

于 2013-10-23T14:58:38.370 に答える
0

たとえば、工場の場合:

class MyBase {};
class MyTypeA : public MyBase {};
class MyTypeB : public MyBase {};

std::shared_ptr< MyBase > make_instance( std::string type )
{
    if( type == "MyTypeA" )
        return std::make_shared< MyTypeA >();
    else
        return std::make_shared< MyTypeB >();
}

<memory>(私が思うように、いくつかのインクルードが必要になります)

于 2013-10-23T15:12:38.453 に答える