在处理默认参数通过值传递的方法/函数时,我提出了一个解决方案,但我不确定它的方法是否有问题。
当所需行为是将单个值作为默认参数时,只需指定一个值即可:
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... */ }
或者可能是指针,默认 arg 为null:
void foo(type* arg=null) { /* if arg is null, generate value. */ }
答案 0 :(得分:0)
我不明白你为什么要这么复杂。作为这个功能的用户,我不希望它像它一样工作。如果签名是
void foo(const type& arg=DEFAULT);
然后我希望以下两个调用是等效的:
foo();
type x = DEFAULT;
foo(x);
问题不在于参考的地址。引用只是原始变量的别名。问题是您期望变量DEFAULT
而不是其值。这不是预期函数参数的工作方式(即使它是传递引用)。
DEFAULT
放在向量中并将其传递给函数。实际上情况更糟:我可以做到,但它不会做我期望的事情。
在这个特殊情况下,我会简单地实现它:
void foo(T arg = 0, bool generateRandom = true) {
T x;
if(generateRandom) x = generate_random();
else x = arg;
// do something with x...
}
然后可以像这样调用:
foo(3.5,false); // uses the value
foo(); // generates a random value