【发布时间】:2011-12-19 00:27:35
【问题描述】:
我正在实现一个 C++ 程序,它可以在给定输入文件的情况下以编程方式实例化对象,该输入文件提供类名和参数以传递给构造函数。
这些类派生自一个公共基类,但它们的构造函数签名不同。
声明如下:
class Base { ... }
class Class1 : Base { Class1(int a1, int a2); }
class Class2 : Base { Class2(int a1, int a2, int a3); }
... and so on...
参数类型不必是 int 类型,实际上它们可以是任何内置类型或复杂的自定义类型。
JSON 格式的程序输入可能如下所示:
[
{ "Class1": ["arg11", "arg12"] },
{ "Class2": ["arg21", "arg22", "arg23"] },
...and so on...
]
通读Boost.Functional/Factory 的文档,如果不是因为在我的应用程序中构造函数签名不同(异质性约束),它似乎可以解决我的问题。 Boost.Function/Factory 的方法是规范化构造函数签名,但这在我的应用程序中是不可能的。
在像 Python 这样的动态语言中,这将相当简单:obj = klass(*args) 其中klass = Class1 和args = ["arg11, "arg12"]。
那么如何在 C++ 中实现具有异构约束的工厂模式呢?
除了 Boost 之外还有其他我忽略的库可能有帮助吗?
是否有可能实现这一点,使得唯一的依赖是标准库(即没有 Boost)?
此外,在构造函数参数是复杂类型的情况下,必须根据其 JSON 表示专门构造它,它如何影响问题的复杂性?
【问题讨论】:
-
为了以后参考,同质的反义词是异构
-
嘿,Seth,根据 Merriam-Webster 词典,“不均匀”也是一个有效词,与“异构”的含义相似。我选择了前者,因为这也是 Boost.Function/Factory 文档的选择(请参阅我帖子中的链接)。
-
是的,我知道,您几乎可以在任何单词中添加“in”或“un”,它仍然是一个单词。听起来很奇怪。
-
@Salman:我看到的关于 Merriam-Webster 的参考文献越多,我就越觉得它是一大堆垃圾。下次,试试牛津英语词典。
-
@DeadMG 我不在乎你对字典的选择有何看法。这与原始问题无关。任何一个词的选择都足够了。但是,如果出于文体原因,一个比另一个更受欢迎,那对我来说很好。但是请不要把它变成关于语言词典的讨论,这将很快退化为关于搜索引擎结果等的讨论。请坚持这个问题。谢谢!
标签: c++ templates boost dispatcher factory-pattern