使用静态/全局变量作为默认参数

Using static/global variables as default arguments

本文关键字:默认 参数 全局变量 静态      更新时间:2023-10-16

我想出了一个解决方案,当处理的方法/函数与默认参数传递值,但我不确定如果它的方法可以是有问题的。

当期望的行为是将单个值作为默认参数时,只需指定一个值就足够了:

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... */ } 

或者指针,默认参数为null:

void foo(type* arg=null) { /* if arg is null, generate value.  */ }

我不明白你为什么要把它弄得这么复杂。作为这个函数的用户,我不希望它像它那样工作。如果签名是

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