如何在 C++ 中使用命名参数
Posted
技术标签:
【中文标题】如何在 C++ 中使用命名参数【英文标题】:How to use named parameters in c++ 【发布时间】:2021-09-04 18:27:33 【问题描述】:在 python 中,我们可以使用参数名称将参数传递给被调用函数,如下面的代码,我们如何在 C++ 中做同样的事情, 我需要这个是因为,如果我们有太多参数,很容易弄乱在被调用函数和调用函数中传递的参数的位置
def calendar(year,month,day):
return "fday:month:year"
print(calendar(day=4,year=2021,month=9) #here arguments are passed in order of day,year and month
输出
"4:9:2021"
与使用命名参数定义函数时传递的参数不一样
string calendar(int year,int month,int day)
return year,month,day;
int main ()
cout<<calendar(" ? ");// How can we pass arguments like that of python in c++
【问题讨论】:
你到底卡在哪里了?此外,不要问有关“C 或 C++”的问题。它们是不同的语言,如果您想了解两者,那么您有两个问题。您提出这个问题的方式表明您实际上没有需要解决的问题(或者您会选择一种实现语言并为问题提供足够的上下文),而只是将语言作为一种琐事进行比较。请记住,Stack Overflow 不是论坛。 C 和 C++ 都不支持命名参数。所以你不能那样做。在 C++ 中最接近命名参数的是这样的 hack:pdimov.github.io/blog/2020/09/07/named-parameters-in-c20 有助于了解调用了哪些功能,并清楚地沟通。我不明白您对代码的调用方最感兴趣。这意味着您正在处理参数。因此,为了解决您的问题,您应该考虑采取的第一步是将c++ named arguments
放入搜索引擎。请记住you are expected to do some research yourself first here.
我投票重新开放是因为,IMO,问题很明确(re. C/C++ equiv of named parameters)。它可能是 KamilCuk 引用的链接的副本,但我喜欢 dbush 的回答。最周到/彻底的解释是github链接,但我们不能将非SE链接标记为重复
当心XY problem,您几乎会成为它的牺牲品。您的真正问题是不是 “如何在C++ 中使用命名参数?” 而是“如何处理具有许多参数的函数在 C++ 中?” 询问根本问题。您可以(并且确实)使用 Python 的方法来说明一种语言是如何实现这一点的,但不要假设在一种语言中有效的东西在另一种语言中直接类似。不同的语言可能对同一障碍使用不同的方法。
【参考方案1】:
C 和 C++ 都不支持命名参数。
最接近此的方法是使用所有参数定义 struct
:
struct cal_params
int year;
int month;
int day;
;
定义函数以获取该结构的实例:
char *calendar(struct cal_params params)
...
然后使用指定的初始值设定项使用复合字面量调用函数:
char *str = calendar((struct cal_params) .year=2021, .month=9, .day=4);
【讨论】:
【参考方案2】:在C++20中,增加了一个指定的初始化器,但是初始化必须按照声明的顺序进行。
struct date_t
int year, month, day;
;
std::string make_calendar(date_t date)
return std::format("0:1:2", date.year, date.month, date.day);
那么,你可以这样称呼它:
make_calendar(.year = 2001, .month = 9, .day = 4)
【讨论】:
【参考方案3】:C++ 没有这个特性。如this answer 所示,您可以通过命名结构的成员来模拟它。或者,您可以命名参数的各个类型:
#include <string>
#include <iostream>
struct Year int value; ;
struct Month int value; ;
struct Day int value; ;
std::string calendar(Year y,Month m,Day d)
return std::to_string(y.value) + "-" + std::to_string(m.value) + "-" + std::to_string(d.value);
int main ()
std::cout<<calendar(Year2001,Month31,Day42);
【讨论】:
以上是关于如何在 C++ 中使用命名参数的主要内容,如果未能解决你的问题,请参考以下文章
超详细的C++入门学习(命名空间,缺省参数,内联函数,函数重载等)