【发布时间】:2017-02-01 13:21:26
【问题描述】:
在处理具有默认参数按值传递的方法/函数时,我想出了一个解决方案,但我不确定它是否会出现问题。
当期望的行为是将单个值作为默认参数时,只需指定一个值就足够了:
void foo(type arg=value)
{
//do something using arg...
}
但是,例如,当期望的行为是生成一个随机值时,情况就不同了。在这种情况下,为了生成一个随机值,我想出了给定的解决方案:
static type DEFAULT = /* value */; //static is optional, DEFAULT can be any name.
void foo(const type& arg=DEFAULT)
{
type x;
if(&arg == &DEFAULT)
x = generate_random();
else x = arg;
// also we could use a ternary like
// type x = (&arg == &DEFAULT? generate_random() : arg)
// do something with x...
}
使用这种方法有什么缺点吗?可以安全地将引用的地址与给定的默认参数的地址进行比较吗?这也适用于方法和静态类变量吗?
其他一些解决方案是:
使用附加签名重载:
void foo(){ /* do something using a random value */ }
void foo(type arg){ /* do something using arg... */ }
或者也许是 pointers,默认 arg 为 null:
void foo(type* arg=null) { /* if arg is null, generate value. */ }
【问题讨论】:
-
在你的情况下,如果没有传递参数,重载函数不是更好吗?的确,这是应该做的。默认值是默认值,而不是默认行为。
-
@GabrielVasconcelos 我明白你的意思。但是,我已经看到函数接收指针并在传递空指针时具有不同的行为(不仅仅是抛出异常)。 SDL's FillRect 函数在将 NULL 传递给其第二个参数时的行为略有不同。
标签: c++ static parameter-passing pass-by-reference default