我尝试从文本文件中读取一个类型并创建它的实例。例如
class MyType {
public:
MyType() {}
~MyType() {}
};
char* type = "MyType";
type object = type();
我知道这不正确,但我认为它解释了我想做的很好。我问是否有办法做到这一点以及如何做?我知道有一种方法可以通过typeid(Type).name();
将类型转换为字符串,但有没有办法扭转这种情况?意思是将字符串转换为类型。
感谢阅读:)。
编辑: 如果你仍然没有得到它。我想要的可以在c#这样做
var myObj = Activator.CreateInstance(Type.GetType(namespaceName + className));
答案 0 :(得分: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;
}
编辑:如果您尝试使用未注册的字符串实例化类,您将获得异常bad_function_call,因为map的operator []将为空的std :: function并调用它。
答案 1 :(得分: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>
我想的包含)