2015-04-01 47 views
1

我有一个复杂的C++科学代码,它使用多个库。 想象一下,有5种不同类型的库,比如线性求解器,集成工具等。对于每种库类型,都有几个不同的库可以完成相同的工作,但具有不同的内部实现。实际上,对于每个库都实现了一个包装类,使得相同类型的所有库具有完全相同的接口。C++模板依赖于来自文件的输入

现在,我想给这个软件给用户。我希望用户能够在代码已经编译之后选择他们想要使用的库。目前它是通过输入文件完成的。

唯一的问题是在主程序中对它进行编码。当编码库选择时,我最终使用嵌套ifs,因此显式编码库的每个可能的组合,以从文件读取的参数为条件。我想知道是否有一个干净的方式来做到这一点。

回答

2

由于模板类型在编译中解析,而不是在运行时解析,所以不能实现依赖于从文件输入的模板。

完成此操作的整洁方式是通过多态(也是优雅的方式; D)。

定义一个Base类,它为每个实现定义接口,使用它自己的实现创建Children类,然后(使用来自file ...的输入...或不要...您的调用)解析哪个算法多态使用。

:)祝你好运。

+0

使用带有来自文件的输入的模板以这种方式完成 a = read_file_a(); if(a == 1){do_sth <1>(); }(a == 2){do_sth <2>();} if(a == 2){do_sth <2>(); } 这段代码可以很好地处理异常,它会因多个模板参数而变得很难看。 我不能立即看到如何实现你的建议,你能写一个带有2个模板参数的短片段吗? – 2015-04-03 11:00:20

+0

是的,这应该工作! 虽然这样做,你实际上并没有使用文件输入来解析模板,但你只需根据输入选择要使用的模板的已编译(已解决)版本......并考虑到这一点,有一个比较优雅的方法是使用设计模式和多态性,例如使用Factory生成所需的对象,具体取决于您从文件中获得的输入,或者可能是Decorator: http://en.wikipedia .org/wiki/Factory_(object-oriented_programming) http://en.wikipedia.org/wiki/Decorator_pattern – 2015-04-06 12:18:50

+0

感谢您的建议:) 我假设上述模式使用动态多态,对吗?一般来说,我被告知害怕它是火,因为它有一点点的性能开销。你是否知道在这种情况下这种开销会有多大,并且如果它只会在类的初始化期间发生,或者在每次调用期间发生? – 2015-04-07 16:15:21