使用静态/全局变量作为默认参数
Using static/global variables as default arguments
我想出了一个解决方案,当处理的方法/函数与默认参数传递值,但我不确定如果它的方法可以是有问题的。
当期望的行为是将单个值作为默认参数时,只需指定一个值就足够了:
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
相关文章:
- 如何使用默认参数等选择模板专业化
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 何时提供默认参数作为模板参数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 函数不接受 X 参数,函数使用默认参数
- initializer_list具有默认参数的构造函数
- C++ 带有默认参数的结构,可选择在构造函数中更改
- 为什么C++构造函数在继承中需要默认参数?
- 必须非常量别名参数及其默认参数常量
- C++ 默认参数使用其他参数
- 组合函数参数包和默认参数
- 如何定义 Vector2f 的默认参数?[SFML]
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 如何设置默认参数以防用户不输入另一个参数
- 结构 c++ 中的默认参数
- 构造函数委托与默认参数
- 默认参数和函数指针作为函数参数C++
- 如何在继承层次结构中调用具有默认参数的构造函数?