【问题标题】:How to use named parameters in c++如何在 C++ 中使用命名参数
【发布时间】:2021-09-04 18:27:33
【问题描述】:

在 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++”的问题。它们是不同的语言,如果您想了解两者,那么您有两个问题。您提出这个问题的方式表明您实际上没有需要解决的问题(或者您会选择一种实现语言并为问题提供足够的上下文),而只是将语言作为一种琐事进行比较。请记住,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 的方法来说明一种语言是如何实现这一点的,但不要假设在一种语言中有效的东西在另一种语言中直接类似。不同的语言可能对同一障碍使用不同的方法。

标签: python c++ user-defined-functions


【解决方案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(Year{2001},Month{31},Day{42});
      }
      

      【讨论】:

        猜你喜欢
        • 2011-10-28
        • 1970-01-01
        • 2018-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 1970-01-01
        • 2021-02-07
        相关资源
        最近更新 更多