我有一个最多需要4个参数的函数,所有参数都是可选的。此外,所有参数都有默认值,用户可以指定他想要的任何参数组合。
所以,如果我有这个:
void func (const A &a = A(), const B &b = B(), const C &c = C(), const D &d = D());
用户可以将其用作func(A(), B())
,但不能用作func(B(), C())
。
有没有办法允许每个参数组合而不必创建一堆重载? (在这种情况下,它将是8)
答案 0 :(得分:0)
我遇到过类似的问题,特别是当你处理一个大而古老的代码库时。最好的解决方案是重新设计事物,这样你就不会遇到这样的问题,但我明白,有时你会面临压力,你必须做很少的改变。
对于类似的东西,我建议创建一个封装该函数参数的类。那个类将具有Builder设计模式:
https://en.wikipedia.org/wiki/Builder_pattern
这样您就可以灵活地传递参数。
在你给出的例子中,你可以这样:
class FuncParams
{
public:
A& getA();
B& getB();
C& getC();
D& getD();
class FuncParamsBuilder
{
FuncParamsBuilder& setA(A& a);
FuncParamsBuilder& setB(B& b);
FuncParamsBuilder& setC(C& c);
FuncParamsBuilder& setD(D& d);
FuncParams *build();
}
static FuncParamsBuilder& builder();
}
然后,你的函数调用就是:
void func(FuncParams *params);
你可以这样称呼它:
func(FuncParams::builder().setA(a).setC(c).build());
请注意,这不是一种完美的代码编码方式:您应该调整上面的代码段以更好地适应您尝试执行的操作。您也可以考虑使用指针,引用,或者甚至更好的智能指针,例如unique_ptr对象。我希望这有帮助!