【问题标题】:In C++, how can you pass some parameters while leaving others as defaults?在 C++ 中,如何传递一些参数而将其他参数保留为默认值?
【发布时间】:2014-08-15 06:38:27
【问题描述】:

我确定这里已经回答了这个问题,但是搜索不断返回 PHP、C# 和 Java。我专门问的是 C++。

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

【问题讨论】:

标签: c++ default-arguments


【解决方案1】:

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

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

这两个规则都与 C++ 重载解析规则相关。

【讨论】:

  • 您对此有 100% 的把握吗?我认为有一个关键字或您可以指定的东西,意思是“使用默认值”......类似 func(DEFAULT, DEFAULT, "Third") 或类似的东西。
  • C++11 中有一个新的 default 关键字,但它用于控制一些默认的 C++ 元素,例如复制/移动构造函数和赋值运算符。
  • 默认参数通常由函数设计者指定。就像在带有 _USEDEFAULT 的 win32 中一样,像 CW_USEDEFAULT 或在 X11 中带有 -1 参数的大小。但这些不是 C++ 内置的。
  • 这就是为什么通常默认值类似于0nullptr 这样如果客户指定它,很容易记住“默认”值是什么...
  • @ChuckWalbourn 关键字 default 在 C++11 中并不新鲜(想想 switch 语句)。 = default 语法是。
【解决方案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);
}

【讨论】:

    【解决方案3】:

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

    func(third_="third")

    请检查=>

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

    【讨论】:

    • 您可以使用 Boost 在此处实现的 Named Parameter Idiom 来解决它,但这仍然不是 C++ 语言的功能。
    • @ChuckWalbourn 我的回答更多是为了参考执行所需操作的可能性。
    【解决方案4】:

    该语言没有直接支持。然而,C++ 程序员常用来代替 类似 bash 的位置参数 的习惯用法是 Named Parameter idiom.

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

    基本上,您有方法(可能是访问器)来修改对象的状态。每个方法都返回一个对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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 2018-12-03
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      相关资源
      最近更新 更多