如何在 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++命名空间与缺省参数

C++命名空间与缺省参数

C++命名空间与缺省参数

超详细的C++入门学习(命名空间,缺省参数,内联函数,函数重载等)

C++入门语法第一篇:(命名空间缺省参数函数重载引用内联函数)

C++入门---基础语法