如何将可选参数传递给 C++ 中的方法?

Posted

技术标签:

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

任何代码sn-p...

【问题讨论】:

你没有传递选项参数。你传递可选参数! 要获得比保留标记值提供的更明确的控制,请查看 boost::optional。 【参考方案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

【讨论】:

以上是关于如何将可选参数传递给 C++ 中的方法?的主要内容,如果未能解决你的问题,请参考以下文章

将可选路径参数传递给 ant

将可选参数传递给 ASP.NET API 的 GET 方法

定义后无法将可选参数传递给express

是否有必要在将可选参数传递给另一个可选参数之前检查它?

检查内部方法是不是传递了一些可选参数

当我将可选参数传递给视图时,为啥我的 CSS 静态文件在 Django 中不起作用?