gpt4 book ai didi

具有异构构造函数约束的 C++ 工厂模式

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:27 26 4
gpt4 key购买 nike

我正在实现一个 C++ 程序,它可以在给定输入文件的情况下以编程方式实例化对象,该输入文件提供要传递给构造函数的类名和参数。

这些类派生自一个公共(public)基类,但它们的构造函数签名各不相同。

声明如下:

class Base { ... }
class Class1 : Base { Class1(int a1, int a2); }
class Class2 : Base { Class2(int a1, int a2, int a3); }
... and so on...

参数类型不必是整数,事实上它们可以是任何内置类型或复杂的自定义类型。

程序输入在 JSON 格式中可能如下所示:

[
{ "Class1": ["arg11", "arg12"] },
{ "Class2": ["arg21", "arg22", "arg23"] },
...and so on...
]

通读 Boost.Functional/Factory 的文档如果不是因为在我的应用程序中构造函数签名不同(异质性约束),它似乎可以解决我的问题。 Boost.Function/Factory 的方法是规范化构造函数签名,但这在我的应用程序中是不可能的。

在像 Python 这样的动态语言中,这将是相当微不足道的:obj = klass(*args) 其中 klass = Class1args = ["arg11 , "arg12"].

那么如何在 C++ 中实现具有异构约束的工厂模式呢?

除了 Boost 之外,还有我忽略的其他库可能有帮助吗?

是否有可能实现它使得唯一的依赖是标准库(即没有 Boost)?

此外,如果构造函数参数属于复杂类型,必须根据其 JSON 表示进行特殊构造,这对问题的复杂性有何影响?

最佳答案

您是否考虑过为每个知道如何从从文件中读取的参数“数组”构造对象的类设置一个工厂方法。

即:

// declared "static" in header file
Class1* Class1::FactoryCreate(int argc, const char** argv)
{
if (argc != 2)
return NULL; // error

int a1 = atoi(argv[0]);
int a2 = atoi(argv[1]);
return new Class1(a1, a2, a3);
}

// declared "static" in header file
Class2* Class2::FactoryCreate(int argc, const char** argv)
{
if (argc != 3)
return NULL; // error
int a1 = atoi(argv[0]);
int a2 = atoi(argv[1]);
int a3 = atoi(argv[2]);
return new Class2(a1, a2, a3);
}

关于具有异构构造函数约束的 C++ 工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8555990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com