从其名称的字符串生成派生类实例.(即反思)

ple*_* me 1 c++ reflection class derived-class

如果我有一个基类:

class Base 
{
public:
virtual void Test()=0;
};
Run Code Online (Sandbox Code Playgroud)

并且,在动态加载的模块(.so/.dll)中,我实现了一个派生自此的类:

class SomethingFromBase : Base 
{
...
};
Run Code Online (Sandbox Code Playgroud)

并且,用户,一旦加载了这个库,就要求创建一个实例SomethingFromBase(假设我们从cin获取名称),并且我们不知道SomethingFromBase(也就是说,没有if(inputstr == "SomethingFrombase") { ... } 任何办法可以创建任何方法来创建SomethingFromBase的一个实例?

我相当肯定这在(标准)C++中是不可能的,但是,我总是希望SO会让我感到惊讶!

如果通过添加一些库可以实现这一点,我仍然想知道它.谢谢!

编辑:请参阅cdhowie的回答.实施此技术的指南:http://www.linuxjournal.com/article/3687 ?page = 0,1 http://www.abstraction.net/ViewArticle.aspx?articleID=67

cdh*_*wie 5

您通常需要插件库定义一个结构类型的全局变量来实现这一点,该结构类型包含指向您可以调用的各种函数的指针.(比如设置,拆卸等)在设置功能期间,他们会回调你的应用程序到一些"注册"功能,在那里他们可以传入一个表示类名称的字符串,以及一个工厂函数指针,它将创建一个实例时执行.

你将它存放在一些地图中,当用户输入一个字符串时,你会查看地图以查看是否注册了工厂功能.如果是这样,请调用它.

所以这不是"真实"的反映,但你可以在某种程度上手动破解它.例如,参见Pidgin,它允许规范可能在协议列表中提供许多条目的协议插件.

编辑: 这是一个实现类似的东西的漂亮指南.我不仅仅是一个C人,所以我不能保证它真的很棒或任何东西,但乍一看它看起来不错.我在Linux上用C做过类似的东西,基本方法效果很好.