C ++中的可选参数,没有重载

时间:2015-10-22 16:23:02

标签: c++ optional-parameters default-parameters

我想要一个带有可选参数的函数,但不会重载该函数。我不想重载的原因是因为函数体很长,带有可选参数的版本只有一行。

void myFunction(MyClass my_optional_arg = MyClass())
{
  // lots of statements

  if (optional_argument_was_passed)
    doSomething(my_optional_arg);

  // lots more statements
}

int main()
{
  myFunction();

  MyClass my_optional_object();
  myFunction(my_optional_object);
}

我对默认参数路由的问题是我不知道如何检查是否传递了可选参数,即我不知道如何设置布尔标志optional_argument_was_passed 。例如,仅使用默认值测试参数的相等性是不够的,因为可以将相同的默认值传递给函数。我真正喜欢的是这样的:

void myFunction(MyClass my_optional_arg = some_unique_null_value)
{
  // lots of statements

  if (my_optional_arg != some_unique_null_value)
    doSomething(my_optional_arg);

  // lots more statements
}

有人建议我做这样的事情:

void myFunction()
{
  MyClass my_object();
  myFunction(my_object);
}

但是,这不是我需要的; myFunction(MyClass)函数不一定是要使用的最终函数。如果我在没有可选参数myFunction()的情况下调用该函数,那么我不希望类MyClass的任何对象都进入该函数;相反,应该省略使用此对象的语句,上面称为doSomething(MyClass)

还建议我将两个函数的公共部分删除到它自己的函数myFunction(),然后创建一个重载的包装函数来使用可选参数调用语句:

void myFunction(MyClass my_optional_arg)
{
  doSomething(my_optional_arg);

  myFunction();
}

这是一个解决方案,但它会有点乱,因为我在doSomething(MyClass)调用之前和之后有很多语句,所以我需要将函数分成几个部分:

void myFunction(MyClass my_optional_arg)
{
  myFunctionPartA();

  doSomething(my_optional_arg);

  myFunctionPartB();
}

void myFunctionPartA()
{
  // lots of statements
}

void myFunctionPartB()
{
  // lots more statements
}

1 个答案:

答案 0 :(得分:1)

如果函数类似,则从另一个调用一个。或者有一个内部'做所有的工作,并采取所有重载调用的功能,所有重载调用。这是一种非常常见的策略

void Func() // func with foo defaulting to 42
{
    Func(42);
}

void Func(int foo)
{
  // one million lines of code
}