初始化算法的设计模式,每个算法接受不同的参数

Its*_*sik 1 c++ design-patterns

我想重新设计一个我拥有的图书馆.
目前我有一套算法,它们不以任何方式相互关联.

我的目标是让所有的具体算法实现,这将包括大约一个接口Init()Run(In,Out)这样我就可以用以下方式执行它们:

void Process()
{
    // IAlgotrithm* algX = new CAlgX(); X:{A,B,C}
    IAlgorithm* algs[] = { algA, algB, algC }; 
    for (int i=0; i < 3; i++) {
        algs[i]->Init(...);
        algs[i]->Run(In,Out);     
    }
 }
Run Code Online (Sandbox Code Playgroud)

问题是,目前每个算法都接受一个不同的结构作为其输入参数.
例如,CAlgA有一个方法Init(CAlgAParameter param),其中CAlgAParameter包含特定于AlgA的字段的结构.每种算法都有自己的结构,由不同类型的完全不同的字段组成.解决这个问题的最佳方法是什么?

我能想到的一个选择是拥有一个包含与所有算法相关的所有参数的地图,并将初始化输入结构的工作委托给算法.也就是说,算法的客户端将不知道具体的输入结构是什么样的 - 基于映射中的所有全局参数来创建其输入结构将是算法工作.我不喜欢这个想法,因为它无法在编译时检查并且容易出错.

什么是最好的方法来解决这个问题?
谢谢

Nim*_*Nim 5

为什么不在构造期间初始化,只需Run()在循环中调用?因此,在构造中,您可以使用户有责任为给定算法提供正确的配置,即

IAlgorithm* algs[] = { new CAlgA(CAlgAParameter(...)), new CAlgB(CAlgBParameter(...)), new CAlgC(CAlgCParameter(...)) }; 

//loop
Run Code Online (Sandbox Code Playgroud)

使用异常来处理算法的错误配置.