【问题标题】:Default parameters: can only the last argument(s) be left?默认参数:只能留下最后一个参数吗?
【发布时间】:2016-10-03 18:34:21
【问题描述】:

我知道有可能这样做:

int foo(int a = 0, int b = 1) { return a + b; }

然后在没有默认参数的情况下使用它,例如:

foo();    // a = 0, b = 1 -> 1

或以最后一个为默认值,例如:

foo(2);    // a = 2 and b = 1 default -> 3

但是我的问题是: 是否可以使用第一个参数的默认值(a)并给出第二个参数的值(b)

我的第一个想法是这样做(这行不通!):

foo(,2);    // a = 0 default and b = 2

是否存在这样的语法 或者这是不可能的?

【问题讨论】:

标签: c++ default-parameters


【解决方案1】:

不,在当前语法中是不可能的。

【讨论】:

    【解决方案2】:

    除了指定默认参数值之外,您还可以使用多个函数重载,例如:

     int foo(int a, int b){return a+b; }
     int foo(int b){return foo(0,b); }     
     int foo(){return foo(0,1); }
    

    【讨论】:

    • 这个效果不是和foo(int b=1, int a=0){..}一样吗?
    • @UNKN57 嗯,是的。但与int foo(int a=0, int b=1) 的效果不同。而且由于模棱两可,您不能同时声明两者。
    • 也许我的例子不是最好的。我想要的是使用具有默认值的第一个参数并将参数值移交给右侧(据我所知,这是不可能的)。
    • @UNKN57 可能是您的示例过于简单。我的关于消除歧义参数类型的建议可能有更多变化。
    • @UNKN57:我不清楚这不完全符合您的要求。如果您拨打foo(2),就好像您拨打了foo(0, 2)。这不正是您在示例中试图做的吗?
    【解决方案3】:

    一旦我们为参数提供了默认值,所有后续参数也必须具有默认值。例如,

    // Invalid
    void add(int a, int b = 3, int c, int d);
    
    // Invalid
    void add(int a, int b = 3, int c, int d = 4);
    
    // Valid
    void add(int a, int c, int b = 3, int d = 4);
    

    【讨论】:

      【解决方案4】:

      我知道这不是您问题的真正答案,但您可以尝试使用boost named parameters。它可能对您的用例有用。

      【讨论】:

      • 我没有实际的用例。只是在学习时自己做了这个(我是一个绝对的 C++ 新手)。但是您的链接似乎很有帮助!
      【解决方案5】:

      这是不可能的。但是,如果您为输入参数声明一个封装默认值并具有单独设置器的结构,则可能会以某种方式:

      #include <iostream>
      
      struct Foo{
          int a,b;
          Foo() : a(0),b(1) {};
          Foo setA(int x) { a=x; return *this;}
          Foo setB(int x) { b=x; return *this;}
      };
      
      void foo(Foo f = Foo()){ std::cout << f.a << "  " << f.b << std::endl; }
      
      int main() {
          foo();                // uses default values for a and b
          foo(Foo().setA(3));   // uses default value for b
          foo(Foo().setB(5));   // uses default value for a
      }
      

      这当然是相当多的开销。另一方面,恕我直言,将参数封装到结构中并在其中提供默认值而不是在函数声明中通常是有意义的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-20
        • 2012-05-22
        • 1970-01-01
        • 2016-02-14
        • 2012-08-07
        • 2015-03-30
        • 2015-05-19
        相关资源
        最近更新 更多