C++中命名参数的使用

How to use named parameters in c++

在 python 中,我们可以使用参数名称将参数传递给被调用的函数,就像在下面的代码中一样,我们如何在 C++ 中做同样的事情, 我需要这个是因为,如果我们有太多参数,很容易弄乱传入被调用函数和调用函数的参数的位置

def calendar(year,month,day):
    return "f{day}:{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++ 都不支持命名参数。

您最接近的是使用所有参数定义一个 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});

C++没有这个功能。如 所示,您可以通过命名结构的成员来模拟它。或者,您可以命名参数的各个类型:

#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(Year{2001},Month{31},Day{42});
}

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})