C++模板问题,将构建器模式拉到配置中
C++ template issue to Pull Up the Builder pattern into a configuration?
我有一个算法,需要大量的参数(即配置(作为其构造函数的一部分,还需要一些明确定义的创建步骤。因此,我创建了一个构建器模式实现,它允许设置所需的参数并创建中间和最终实例,例如
// somewhere
class SomeAlgo {
public:
SomeAlgo(double a, double b, double c, double d, double e /* etc */);
;
现在我将构建器定义为例如
class SomeAlgoBuilder {
public:
SomeAlgo& createResult() { /* TODO: */ }
virtual SomeAlgoBuilder& creationStep1() = 0;
virtual SomeAlgoBuilder& creationStep2() = 0;
virtual SomeAlgoBuilder& creationStep3() = 0;
// example setter note the builder returns *this
SomeAlgoBuilder& setA(double a) { a_ = a; return *this; }
SomeAlgoBuilder& setB(double b) { b_ = b; return *this; }
// etc
};
在这一点上,一切看起来都不错,但现在我想将构建器的 setter Pull Up
到一个 SomeAlgoConfig
类中,以便我还可以涵盖传递简单配置而不是复杂的长参数列表的用例。这种简单的配置在Java中被称为值对象或Bean。新的生成器将是这样的:
// not "is a" config but need the implementation inheritance
// >>>>>> note the need to pass SomeAlgoBuilder as template
class SomeAlgoBuilder : private SomeAlgoConfig<SomeAlgoBuilder> {
public:
SomeAlgo& createResult() { /* TODO: */ }
virtual SomeAlgoBuilder& creationStep1() = 0;
virtual SomeAlgoBuilder& creationStep2() = 0;
virtual SomeAlgoBuilder& creationStep3() = 0;
};
现在SomeAlgoConfig
实现:
template<T>
class SomeAlgoConfig {
T& setA(double a) { a_ = a; return *static_cast<T*>(this); }
T& setB(double b) { b_ = b; return *static_cast<T*>(this); }
// etc
}
意图是像这样使用:
SomeAlgoConfig config; // <<< here it won't compile because it misses the T parameter
config.setA(a).setB(b).setC(c);
我猜这会起作用。但是,每当我想单独使用SomeAlgoConfig
(在构建器的上下文之外(时,例如将其作为参数传递,我需要使用模板参数声明它,该模板参数本身将SomeAlgoConfig<SomeAlgoConfig>
。如何以默认为模板类型的方式定义它?例如,这样做不起作用:template<typename T = SomeAlgoConfig> class SomeAlgoConfig
因为此时SomeAlgoConfig
还不知道。
Config 应该像参数的容器,因此当您改变对要传递的参数的想法时,您不必更改构造函数和 setter。 让构建器继承配置是没有意义的,因为生成器不是配置,"我需要继承的方法"不是在设计中实现这一点的有效参数。您可以将 config 作为构建器的成员并调用:
builder.getConfig().setA(a);
builder.getConfig().setB(b);
//...
builder.createResult();
如果你想要一个模板配置,你也可以制作构建器模板,例如:
template<class T>
class AlgoBuilder<T>{
//...
private:
AlgoConfig<T> config;
这样,您就可以在构造函数中设置传递配置。
关于您在实例化配置时缺少 T 参数的问题......那么,在这一点上,由于您要设置 a、b 、c 和所有其他参数,您已经知道参数的类型,因此您实际上可以使用 T 类型实例化配置,这与参数类型相同。AlgoConfig
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 无法找到/读取配置文件.conf-FileIOException
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 如何使用配置模式进行find_package搜索并在模块模式下回退?
- C++文件可配置的编译时多态模式?
- 如何使用适用于 Mac 和 Windows 10 的 vscode 设置同步插件配置C++智能感知模式
- C++基于配置的生成器模式
- 构建器模式 - 配置文件读数
- 以可维护的方式管理应用程序配置的模式
- 如何在运行时配置访问者模式
- C++模板问题,将构建器模式拉到配置中
- MSBuild配置错误WDK 8.1 Visual Studio 2015无法生成内核模式驱动程序
- Binutils ld链接器如何配置模拟模式(使用mingw生成后不支持模拟)
- 从配置文件中动态加载正则表达式模式
- 配置由Factory构建的对象的正确模式