我有一些代码,其中我有一个基类(让我们称之为foo
),它具有由生成脚本创建的数量可变的派生类(在10-500之间)。目前,我们有一个函数,它将创建一个新的基类,方法是将其名称作为字符串传入,然后使用一个巨大的if/else语句找到正确的基类。例如
if (name == "P2_26") {add_module(new P2_26());}
else if (name == "P4_30") {add_module(new P4_30());}
...
这导致了一个巨大的if else块。在我看来,这就像是可以通过使用标记调度来简化的代码,但是我在网上找到的每个例子都使用了内置的迭代器,比如已经定义了标记的迭代器,我无法插入到我的用例中。有没有任何方法来简化这段代码?
2条答案
按热度按时间omqzjyyz1#
标记调度是基于类型信息作为输入的。从您的代码判断,您有一个字符串作为输入,它不能在运行时使用。
您的案例看起来更像一个抽象工厂:
然后生成的文件应包括:
型
这个解决方案将在程序启动时自动注册所有类,这更像是你以前所做的。
UPD.
要使用它,你可以简单地用这一行替换所有的if-else代码:
或者,如果无法在
add_module
中处理nullptr
:感谢D Drmmr使这段代码变得更好。
wxclj1h52#
现在我们可以:
在代码中你可以做到:
这是一个数据驱动的设计。搜索正确的类型是在对数时间内完成的,而不是像你的代码那样是线性的。你可以用
unordered_map
代替set
。"P2_26"
)。现在您可以使用
add_module(tag<P2_26>)
并跳过冗长的if/else语句。我们甚至可以通过以下方式隐藏外部
add_module
的实现:同样,我们可以使用
add_module(tag<P4_30>)
,它就可以正常工作。