C++ 当程序员创建时,自动将类型派生类(不是实例)添加到列表中。c++;

C++ 当程序员创建时,自动将类型派生类(不是实例)添加到列表中。c++;,c++,class,templates,types,derived,C++,Class,Templates,Types,Derived,因此,我正在编写一个程序,很快将被传递给另一个程序员。我想做的是使它能够从父类进程[它的实际代码,而不仅仅是一个新实例]创建一个新的派生类,它将自动添加到程序其他部分使用的列表中。这样,当他创建一个派生类时,他就不必通过将它添加到程序的其他部分来集成它。他所要做的就是制作这个类,并且它可以按原样与程序一起使用 例如,程序的一部分会提示用户希望运行哪种类型的进程。如果下一个程序员要向进程添加新的派生类,我希望该进程自动出现在用户可以运行的进程列表中 一些代码。。。 程序员创建新的头文件,例如(为确

因此,我正在编写一个程序,很快将被传递给另一个程序员。我想做的是使它能够从父类
进程
[它的实际代码,而不仅仅是一个新实例]创建一个新的派生类,它将自动添加到程序其他部分使用的列表中。这样,当他创建一个派生类时,他就不必通过将它添加到程序的其他部分来集成它。他所要做的就是制作这个类,并且它可以按原样与程序一起使用

例如,程序的一部分会提示用户希望运行哪种类型的进程。如果下一个程序员要向进程添加新的派生类,我希望该进程自动出现在用户可以运行的进程列表中

一些代码。。。 程序员创建新的头文件,例如(为确保安全起见,对某些部分进行了伪编码,但不编译):

程序运行并提示用户运行哪个进程

cout << "What process would you like to run?" << endl;
for(iterate through all derived process classes here)
    cout << derivedClass::processName << endl;
cin >> processChoice;
runProcess(processChoice, data);
这就是它的想法。我希望在创建新的派生类头文件时,已创建所有派生进程的for循环部分
runProcess()
将根据需要从派生类调用函数。否则,我将只创建一个索引
映射
,程序员必须手动将其新派生的类添加到该映射中

我不知道该怎么做,有人有主意吗?

这看起来很难。 C++不是设计成能反映的。 想法一,让第二个程序员添加这样的宏调用

REGISTER(name_of_class)
在他的主要通话中(如果他写主要通话)
或者在实现文件中(由于调用函数以使用其名称注册类,宏需要扩展为声明变量的内容(静态就足够了)

这不可能以完全自动的方式实现。除了编写派生类(即注册派生类)之外,您的继任者还必须投入一些最小的工作


有关如何进行注册表的示例,请参阅。这个答案还列出了这种方法的一些注意事项。

使从流程派生非法

创建一个CRTP
Process\u Child
,它是唯一允许从Process派生的类
Process\u Child
使用private和friend来确保只有
D
可以从中派生,并且在构造函数中检查
D
是否实际从中派生(
static\u assert

在这一点上,我们相当强硬

Process\u Child
有一个在其构造函数中引用的私有静态数据成员(如果有人在任何地方编写构造
D
的代码,则强制该成员存在)。这个私有静态数据成员没有任何状态,但在构造时它注册了
进程\u子进程

假设他们编写了一个名为
Bob
的进程。Bob是一个
进程\u子进程
。他们编译,得到一个错误,
Process\u Child::registration\u token
不存在。他们宣布,轰,完成了

这不是自动注册:相反,如果注册没有发生,它会生成编译时错误

我们可以后退一步,在第一次构造
进程\u Child
时进行注册,但如果不先注册,这可能永远不会发生


运行时注册的替代方法是维护类型列表
templatestruct类型{}并使用类似的机制检查
Process\u Child
中的
D
类型是否在该列表中

最终用户不需要在
.cpp
文件中创建
Process\u Child::registration\u token
,而需要修改公共头文件,将
D
添加到类型列表中


同样,这不是自动发生的。但如果不这样做,将导致生成错误。

不完全清楚如何将类添加到列表中。也许可以举个例子。这实际上是我的问题^^^^如何自动将新的类类型添加到可访问的列表中。因此,您所要做的就是生成头文件。通过这种方式,在创建新类时,它已经被集成,而不是将新类名添加到大量if-else语句中以选择进程。显示您希望避免的内容,以及您希望客户端代码的外观。如果我们不得不在一片“如果其他”的海洋中航行,那么它肯定会看起来很糟糕,但它从何而来还不太清楚。也许你真的应该展示一些代码。这些似乎是目前为止最好的解决方案。我还没有检查你的答案,希望有人能找到一种自动执行的方法。你不能断言
static\u
来自CRTP的
D
,因为它不会在实例化点完全声明。但是,您可以将构造函数声明为私有,并使
D
成为朋友。@Quen在CRTP的ctor中执行,而不是在正文中。直到派生类调用它,才检查Ctor体,到那个时候派生是可见的。@Yakk如此简单,我从来没有想到过它。。。好。谢谢你:)
Process* process = NULL;
for(iterate through all derived process classes or an indexed map would be nice)
    if(processName == derivedClass::processName)
        process = new derivedClass;
process->run(data);
REGISTER(name_of_class)