我想要一个带有可选参数的函数,但不会重载该函数。我不想重载的原因是因为函数体很长,带有可选参数的版本只有一行。
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
}
答案 0 :(得分:1)
如果函数类似,则从另一个调用一个。或者有一个内部'做所有的工作,并采取所有重载调用的功能,所有重载调用。这是一种非常常见的策略
void Func() // func with foo defaulting to 42
{
Func(42);
}
void Func(int foo)
{
// one million lines of code
}