方法采用两个默认参数

时间:2011-08-04 07:00:03

标签: c++

我有一个方法,其定义如下:

void foo(int i = 0, bool flag = false) {}

我想通过仅传递第二个参数来调用foo():

foo(true);

但是像这样它总是将它传递给第一个参数(i) 有没有其他解决方案我可以将我的论点传递给第二个参数?或者唯一的方法是通过第一个。

foo(0, true);

5 个答案:

答案 0 :(得分:7)

技术上没有。但是你可以用重载来伪造它,因此:

void foo(bool flag)
{
    foo(0,flag);
}

答案 1 :(得分:2)

没有。与python不同,您无法明确说明要使用哪个参数值。如果您需要最后一个参数,则必须使用所有参数调用该方法。

答案 2 :(得分:2)

在C ++中不可能,因为它不支持命名参数:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.20

但是你可以使用重载:

void foo(int i, bool flag) {
    //do stuff
}
inline void foo(int i) { foo(i, false); }
inline void foo(bool flag) { foo(0, flag); }


int main(void) {
    foo(42);
    foo(true);
    return 0;
}

前者包括基本实现,后者将被调用。

注意他们是inline

答案 3 :(得分:1)

不,当您只想传递一个参数时,您将传递第一个参数。编译器如何猜测您打算使用哪个参数?

答案 4 :(得分:0)

有一个很好的“技巧”叫做命名参数idiom:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.20

这是您为代码实现它的一种粗略方式。 (虽然它真的只适用于有更多默认/可选参数的情况)

class Foo
{
  public:
    //set the defaults
    Foo():i_(100),flag_(false) {}
    //provide the mutators
    Foo& i(int in_i) { i_ = in_i; return *this; }
    Foo& flag(int in_flag) { flag_ = in_flag; return *this; }
    void operator() { foo( arg.i_, arg.flag_ ); } //Just forward to the full argument version
  protected:
    int i_;
    bool flag_;
};

现在您可以像这样使用它:

Foo()(); // First () creates temporary, second calls its operator()
Foo().i(20)();
Foo().flag(false)();
Foo().i(10).flag(false)();

你可以使用这个技巧的一些变种。您可以将参数放入带有mutator的结构中,但是写一个void foo(FooArgs)函数。在这种情况下,您最终得到的结果如下:

foo( FooArgs().i(10) );

您也可以从foo析构函数而不是Foo调用operator()。在这种情况下,您的通话看起来像这样:

Foo().i(20); // foo called when this temporary destructs