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

时间:2016-09-23 15:50:33

标签: c++ static parameter-passing pass-by-reference default

在处理默认参数通过值传递的方法/函数时,我提出了一个解决方案,但我不确定它的方法是否有问题。

当所需行为是将单个值作为默认参数时,只需指定一个值即可:

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

1 个答案:

答案 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