我有一个方法,其定义如下:
void foo(int i = 0, bool flag = false) {}
我想通过仅传递第二个参数来调用foo():
foo(true);
但是像这样它总是将它传递给第一个参数(i) 有没有其他解决方案我可以将我的论点传递给第二个参数?或者唯一的方法是通过第一个。
foo(0, true);
答案 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