1

我正在尝试从文本文件中读取类型并创建它的实例。例如

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

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

我知道这是不正确的,但我认为它解释了我正在努力做得很好。我在问是否有办法做到这一点以及如何做到这一点?我知道有一种方法可以将类型转换为字符串 viatypeid(Type).name();但有没有办法扭转这种情况?意味着将字符串转换为类型。

谢谢阅读 :)。

编辑:如果你仍然不明白。我想要的可以像这样在c#中完成

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

2 回答 2

3

您必须使用设计模式工厂

对于下面那些想要源代码的人来说,有一个快速而肮脏的工厂。它使用 c++11,它不是 const 正确的,并且对构造函数的参数有基本的支持,只要它们通过创建函数都是相同的

#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;
}

编辑:如果您尝试使用未注册的字符串实例化一个类,您将收到异常 bad_function_call 因为 map 的 operator[] 将是一个空的 std::function 并调用它。

于 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 回答