1

我确定这已经在这里得到了回答,但是搜索不断返回 PHP、C# 和 Java。我特别问的是C++。

如果我有一个接受五个参数的函数并且它们都有默认值,但我想显式调用它并为第三个参数提供一个值,那么我应该为第一个和第二个参数传递什么?(我知道func(,,"Third")不起作用,也没有func(thirdArg:"Third")

4

4 回答 4

4

在 C++ 中,您必须指定所有参数直到默认值,所以它必须是func("First","Second","Third").

C++ 还要求您在参数列表的“末尾”有默认值,因此您不能执行类似的操作func(defaulted, not-defaulted)

这两个规则都与 C++ 重载决议规则相关联。

于 2014-08-15T06:39:29.497 回答
2

您可以对 Java 构造函数中的默认参数的解决方案进行类似的处理。

但我不认为这在 C++ 中是一个好习惯,尤其是对于函数,因为上面怎么说 - 在非默认参数之后通常接受的默认参数的位置。

使用函数重载实现的解决方案:

void Foo(int default, int nodefault){
    ...
}

void Foo(int nodefault){
    Foo(10, nodefault); //10 - is default option
}

int main(){
    Foo(3); //calls Foo(10, 3);
}
于 2014-08-15T09:07:42.590 回答
0

该语言没有直接支持。然而,C++ 程序员经常使用的一个习惯用法来替代缺少类似 bash 的位置参数命名参数习惯用法。.

假设你的函数是一个类的成员方法,你可以很容易地应用这个习惯用法:

基本上,您有方法(可能是访问器)来修改对象的状态。每个方法都返回一个对 的非常量引用this,从而允许方法链接。

例子:

class Person{

public:

    Person& setAge(int agep) { age = agep ; return *this; }

    Person& setWeight(double weightp) { weight = weightp ; return *this; }

    Person& setName(const std::string& namep) { name = namep ; return *this; }

private:
    int age = 0;
    double weight = 0.0;
    std::string name;
};

int main(){
    Person p;

    p.setAge(42).setName("Kurt"); // set age and name, but not weight
}
于 2014-08-15T07:31:06.580 回答
0

这不是微不足道的。可能你可以试试 boost 参数。你可以这样传递参数,

func(third_="third")

请检查 =>

http://www.boost.org/doc/libs/1_56_0/libs/parameter/doc/html/index.html#named-function-parameters

于 2014-08-15T06:43:46.140 回答