【问题标题】:How to pass optional arguments to a method in C++?如何将可选参数传递给 C++ 中的方法?
【发布时间】:2011-04-16 14:16:29
【问题描述】:

如何将可选参数传递给 C++ 中的方法? 任何代码sn-p...

【问题讨论】:

  • 你没有传递选项参数。你传递可选参数!
  • 要获得比保留标记值提供的更明确的控制,请查看 boost::optional。

标签: c++ optional-arguments


【解决方案1】:

用逗号分隔它们,就像没有默认值的参数一样。

int func( int x = 0, int y = 0 );

func(); // doesn't pass optional parameters, defaults are used, x = 0 and y = 0

func(1, 2); // provides optional parameters, x = 1 and y = 2

【讨论】:

    【解决方案2】:

    通常通过为参数设置默认值:

    int func(int a, int b = -1) { 
        std::cout << "a = " << a;
        if (b != -1)        
            std::cout << ", b = " << b;
        std::cout << "\n";
    }
    
    int main() { 
        func(1, 2);  // prints "a=1, b=2\n"
        func(3);     // prints "a=3\n"
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      这里是作为可选参数传递模式的示例

      void myfunc(int blah, int mode = 0)
      {
          if (mode == 0)
              do_something();
           else
              do_something_else();
      }
      

      你可以通过两种方式调用 myfunc 并且都有效

      myfunc(10);     // Mode will be set to default 0
      myfunc(10, 1);  // Mode will be set to 1
      

      【讨论】:

      • 你能提供一些与字符串相关的例子吗?
      • void myfunc(int blah, char mode[] = NULL)
      • NULL 表示一个 NULL 指针,即使它被定义为文字 0。它不是常数零的通用名称。对于整数(非指针),您应该使用数字:int mode = 0
      • 如果你正在使用一个类(源文件和头文件),你会在哪里定义默认值?
      • @AceFunk 超级晚,但我看到的代码在标题中定义了默认值。如果您考虑一下,如果在源代码中定义了可选项,系统将不知道您可以省略该值
      【解决方案4】:

      使用默认参数

      template <typename T>
      void func(T a, T b = T()) {
      
         std::cout << a << b;
      
      }
      
      int main()
      {
          func(1,4); // a = 1, b = 4
          func(1);   // a = 1, b = 0
      
          std::string x = "Hello";
          std::string y = "World";
      
          func(x,y);  // a = "Hello", b ="World"
          func(x);    // a = "Hello", b = "" 
      
      }
      

      注意:以下格式不正确

      template <typename T>
      void func(T a = T(), T b )
      
      template <typename T>
      void func(T a, T b = a )
      

      【讨论】:

      • 感谢您的通用解决方案,我试图弄清楚如何为任意类型提供默认值。
      【解决方案5】:

      关于默认参数使用的重要规则:
      默认参数应该在最右边指定,一旦指定了默认值参数,就不能再指定非默认参数。 例如:

      int DoSomething(int x, int y = 10, int z) -----------> Not Allowed
      
      int DoSomething(int x, int z, int y = 10) -----------> Allowed 
      

      【讨论】:

      • @Chubsdad - Ahh..my bad ambiguous statement!第二个语句是否正确总结了它? “一旦指定了默认值参数,就不能再指定非默认参数”
      • 所以如果我理解正确,如果我有多个可选参数,我应该实现所有这些参数还是根本不实现?我不能选择使用 1 个可选参数而不是其余参数?
      • @Gerard:“允许”示例显示了一个可选参数,而不是其他有效的用例。
      • 我明白,但如果我有int foo(int x, int y = 10, int z = 10) 并想调用foo(1,2),那么只提供一个可选参数。我自己似乎无法让它工作。
      【解决方案6】:

      如果有多个默认参数,你们中的一些人可能会感兴趣:

      void printValues(int x=10, int y=20, int z=30)
      {
          std::cout << "Values: " << x << " " << y << " " << z << '\n';
      }
      

      给定以下函数调用:

      printValues(1, 2, 3);
      printValues(1, 2);
      printValues(1);
      printValues();
      

      产生以下输出:

      Values: 1 2 3
      Values: 1 2 30
      Values: 1 20 30
      Values: 10 20 30
      

      参考:http://www.learncpp.com/cpp-tutorial/77-default-parameters/

      【讨论】:

      • 这就是我想要的。使用一个可以处理不同数量参数的函数。在头文件中用默认值声明函数,然后在没有默认参数的情况下定义它,然后你就可以使用它了。无需使函数重载
      【解决方案7】:

      为了遵循此处给出的示例,但为了阐明使用头文件的语法,函数前向声明包含可选参数默认值。

      我的文件.h

      void myfunc(int blah, int mode = 0);
      

      我的文件.cpp

      void myfunc(int blah, int mode) /* mode = 0 */
      {
          if (mode == 0)
              do_something();
           else
              do_something_else();
      }
      

      【讨论】:

        【解决方案8】:

        随着 C++17 中 std::optional 的引入,您可以传递可选参数:

        #include <iostream>
        #include <string>
        #include <optional>
        
        void myfunc(const std::string& id, const std::optional<std::string>& param = std::nullopt)
        {
            std::cout << "id=" << id << ", param=";
        
            if (param)
                std::cout << *param << std::endl;
            else
                std::cout << "<parameter not set>" << std::endl;
        }
        
        int main() 
        {
            myfunc("first");
            myfunc("second" , "something");
        }
        

        输出:

        id=first param=<parameter not set>
        id=second param=something
        

        https://en.cppreference.com/w/cpp/utility/optional

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-07
          • 2013-02-08
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          • 2021-06-30
          • 1970-01-01
          相关资源
          最近更新 更多