C ++:默认参数的组合

时间:2017-09-20 21:12:46

标签: c++ overloading default-arguments

我有一个最多需要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)

1 个答案:

答案 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对象。我希望这有帮助!