C++ 中有没有办法像在 python 中那样按名称传递参数?[复制]

Is there a way in C++ to pass arguments by name like in python? [duplicate]

提问人:mooko 提问时间:2/8/2021 最后编辑:cigienmooko 更新时间:11/13/2023 访问量:5201

问:

C++ 中有没有办法像在 python 中那样按名称传递参数? 例如,我有一个函数:

void foo(int a, int b = 1, int c = 3, int d = 5);

我可以以某种方式称呼它为:

foo(5 /* a */, c = 5, d = 8);

foo(5, /* a */, d = 1);
C++ 函数 参数传递

评论

1赞 m88 2/8/2021
聚合初始化可以有指示符,但它是 C++20 功能。

答:

4赞 Educorreia 2/8/2021 #1


您必须按顺序传递参数,因此,要指定 的值,您还必须指定一个值,因为它在它之前声明。
dc

17赞 cigien 2/8/2021 #2

C++ 中没有命名的函数参数,但您可以使用 C++20 中的指定初始值设定项实现类似的效果。

获取所有函数参数并将它们放入一个结构体中:

struct S 
{
    int a{}, b{}, c{}, d{};
};

现在修改你的函数以采用该结构的实例(为了提高效率)const&

void foo(S s) 
{
    std::cout << s.a << " " << s.b << " " << s.c << " " << s.d;  // for example
}

现在你可以像这样调用这个函数:

foo({.a = 2, .c = 3});  // prints 2 0 3 0 
                        // b and d get default values of 0

这是一个演示

评论

0赞 vhmvd 5/8/2022
感谢您的回答,这似乎是一个巧妙的方法。但是,它能被称为一种好的做法,还是可以被称为一种噱头?
1赞 cigien 5/9/2022
@Ahmn21 这是一个相对现代的功能,因为它只在语言中存在了几年,所以现在说这是否是好的做法还为时过早。但是,这是完全有效的代码,我想说这是实现命名参数之类的东西的一种非常合理的方法。据我所知,这种方法没有任何缺点。