如何在C++中实现类似Python的命名参数传参功能
C++实现类似Python命名参数的方案
C++原生不支持Python那种直接通过参数名任意顺序传参的语法,但可以通过以下两种无额外依赖的原生方案实现相同效果,避免参数多的时候传参顺序混淆:
方案1:C++20 指定初始化器(最推荐)
C++20标准新增了结构体指定初始化器语法,写法和Python命名参数非常接近,是目前最优的实现方式:
#include <iostream> #include <string> #include <format> // 定义存储参数的结构体 struct CalendarParams { int year; int month; int day; }; std::string calendar(CalendarParams params) { return std::format("{}:{}:{}", params.day, params.month, params.year); } int main () { // 可以完全任意顺序传参,和Python使用体验一致 std::cout << calendar({.day = 4, .year = 2021, .month = 9}) << std::endl; return 0; }
运行输出结果为:4:9:2021,和Python示例的输出完全一致。
方案2:链式参数封装(兼容C++11及以上旧版本)
如果你的项目暂时不支持C++20,可以用链式参数的方式封装参数,同样支持任意顺序传参:
#include <iostream> #include <string> // 封装参数类,每个set方法返回自身引用实现链式调用 class CalendarParams { public: int year, month, day; CalendarParams& set_year(int y) { year = y; return *this; } CalendarParams& set_month(int m) { month = m; return *this; } CalendarParams& set_day(int d) { day = d; return *this; } }; std::string calendar(CalendarParams params) { return std::to_string(params.day) + ":" + std::to_string(params.month) + ":" + std::to_string(params.year); } int main () { // 任意顺序调用set方法传递参数 std::cout << calendar(CalendarParams().set_day(4).set_year(2021).set_month(9)) << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Puneeth G P
相关产品推荐
相关产品推荐

