【发布时间】:2018-05-20 17:05:06
【问题描述】:
我有一个类的构造函数如下所示:
GlslProgram(const char* vertex_shader_path, const char* fragment_shader_path, const char* tess_control_shader_path = "", const char* tess_eval_shader_path = "", const char* geom_shader_path = "");
最后三个参数都是可选的,因为""被用作默认参数。
但是,由于 C++ 不支持位置参数,如果想要调用没有tess_control_shader_path 和tess_eval_shader_path 但使用geom_shader_path 的构造函数,他们必须传入两个位置"" 参数(而不是@ 987654328@ 或更清楚的信息)。
有没有一种干净或简单的方法来摆脱这种情况?换句话说:有没有办法让特定的参数放置变得不必要?
我正在查看named constructor idiom,但我不喜欢这个想法,因为在这种情况下,命名约定实际上没有意义(即GlslProgram::withGeometryShader、GlslProgram::withTesselation)似乎没有意义。
理想情况下,我会有类似的东西:
GlslProgram().vertex_path("path")
.fragment_path("path")
.geo_path("path")
.tesselation_path("path");
但这里的问题是,当所有参数都完成(所有文件路径都完成)时,需要进行最后的初始化步骤,所以我不知道如何知道链中的最终“路径”是。
【问题讨论】:
-
如果您可以“跳过”据称需要的参数,那么从技术上讲,所有参数似乎都是可选的。为什么将它们都放在构造函数中?难道你不能只将它们作为具有访问器函数的成员变量,然后在你设置了你想要的之后调用一个初始化方法吗?
-
另一种选择是让构造函数采用一个对象,该对象具有这些路径作为具有默认值的成员
-
@amnesia 前两个参数不能跳过。
标签: c++ constructor