在C++中模拟函数的关键字参数
摘要
本文演示了一种通过使用带有指定初始化器的结构体来模拟Python风格关键字参数的技术,无需宏或模板魔法即可提高代码可读性。
暂无内容
查看缓存全文
缓存时间: 2026/06/12 02:53
# 在C++中模拟函数的关键字参数
来源:https://nibblestew.blogspot.com/2026/06/faking-keyword-arguments-to-functions.html
Python的众多优秀语言特性之一就是关键字参数。它们使得某些类型的API简洁且可读。如下所示:
[](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipxolHgFLDFeecuGLIStC9PHsYEy2ORmWmYmGLW3OAR562zUbR5Yl3RtBcdwHDCrPB7gUBBQUzVR-GrRJr4ZTzbGiLoRXUzYKa_KIzL0qnCsY9_DZOTvlW92oJKv0P6RWx4gl1vkUzGtBOX_JYK2-L3SyXoBrDwypMLjG24g8N8rtQQngNvcLiPdoJ_Bs/s1454/python_kwargs.png)
遗憾的是,C语言没有关键字参数,因此C++也没有。将其作为语言特性添加将需要15-20年的努力,其中大部分时间将花在通过电子邮件说服人们这样的特性很重要且应该被添加。
曾经有人尝试通过宏和模板魔法来实现这一点(链接 (https://www.boost.org/doc/libs/latest/libs/parameter/doc/html/index.html)),但由于它们使用了宏和模板魔法,所以并未得到广泛使用。然而事实证明,借助现代语言特性,你可以相当令人信服地模拟关键字参数。如下所示:
[](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT2a2DpfVw3HgiPZ5YMC3ppEOpBRy7At4tsGbRVGgP89w-fwV0VojJzk2rSzMWtu2vLkU_YJjVPW3qcLI86pVcOuizA-HFiNocqnMI9p75JkX4_yfRYjyUThm8nsnmpkD5rnsani1R8Z5BoSsd8POUVAfHGMBlSpAo9unaAGHHW5kt1e_g5CUQbH6K21E/s910/cpp_kwargs.png)
`add_argument`方法接受一个参数,这个参数是一个结构体。括号内额外的花括号本质上意味着“无论底层参数是什么,用这些参数在原地构造它”。带点的名字是指定初始化器,因此这些字段会获得指定的值,而其他字段则使用它们的默认值。
就这样,C++中的关键字参数。你只需要稍微眯起眼睛,假装没看到那些额外的花括号。
相似文章
我们也有命名参数了——家庭版
文章探讨了Rust通过类型系统和结构体模拟命名参数的方法,这是一种无需新增语言特性的便捷替代方案。
C++ 中的惰性初始化
本文解释 C++ 中的惰性初始化,通过将计算推迟到必要时来优化性能,使用辅助结构体来利用 std::optional 中的转换运算符。
GCC的嵌套函数实现(对比C++ Lambda表达式)
本文在一篇技术博客文章中解释了GCC嵌套函数的实现,通过创建合成结构来访问父变量,并与C++ Lambda表达式进行了对比。
参数之争
本文探讨了在编程语言中使用命名参数和灵活参数风格的权衡,比较了 Rust 的简洁性与 Ruby 的简练性,并对在 Rust 中采用类似功能表示怀疑。
在 C 中调用一个函数而不给它命名
一场关于在 C 语言中不直接命名就调用函数的技术讨论,涵盖底层语言技巧以及编译器和链接器的行为。