假设我有:
void f(bool option1 = false, bool option2 =false, bool option3 = false)
{
...
}
我想打电话:
f(option2=true);
这在C ++中是否可行?
答案 0 :(得分:14)
无法以您在C ++中建议的方式调用函数。您可以通过元编程模拟命名参数,或者只是将struct
传递给您的函数。 E.g。
struct options
{
bool option0{false};
bool option1{false};
bool option2{false};
};
void f(options opts = {});
C ++ 11用法:
options opts;
opts.option2 = true;
f(opts);
C ++ 2a用法:
f({.option2=true});
答案 1 :(得分:5)
作为替代方案,您可以使用位标志:
enum FOption
{
option0 = 1 << 0,
option1 = 1 << 1,
option2 = 1 << 2,
};
void f(FOption opt = 0) {
const bool opt0 = opt & option0;
const bool opt1 = opt & option1;
const bool opt2 = opt & option2;
/*...*/
}
然后像:
一样使用它f(option2);
f(option1 | option2);
答案 2 :(得分:4)
我有12个可选参数
如果您的所有可选参数都是bool
类型,则可以使用flag enum:
enum class OptionFlags {
Option1 = 1,
Option2 = 2,
Option3 = 4,
Option4 = 8
};
inline OptionFlags operator|(OptionFlags a, OptionFlags b) {
return static_cast<OptionFlags>(static_cast<int>(a) | static_cast<int>(b));
}
现在您可以按如下方式定义您的功能:
void f(OptionFlags f) {
...
}
用户会这样称呼:
f(OptionFlags::Option1 | OptionFlags::Option3); // Option1==true, Option3==true
答案 3 :(得分:2)
不,你不能这样做,参数的名称可以在呼叫站点说不存在。有几种方法可以解决这个问题。实际上我已经说过3 bool
个参数已经是一个积极做某事的原因,以避免调用者混淆并允许用户拥有正确的名称。
有些人可能不喜欢这种简单的方法,但它可以作为一个起点:
struct f_params {
bool a;
bool b;
bool c;
f_params() : a(false),b(false),c(false) {}
f_params& set_a(bool x) {
a = x;
return *this;
}
};
调用者现在可能只设置非默认值:
f_params x;
x.a = true;
f(x);
// or..
f(f_params().set_a(true));