C ++默认参数乱序?

时间:2018-05-15 19:38:17

标签: c++

假设我有:

void f(bool option1 = false, bool option2 =false, bool option3 = false) 
{
     ... 
}

我想打电话:

f(option2=true);

这在C ++中是否可行?

4 个答案:

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