在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++中的关键字参数。你只需要稍微眯起眼睛,假装没看到那些额外的花括号。
相似文章
C语言中在C++中仍然无法工作的构造——以及一些已发生变化的构造
一篇更新经典调查的博文,关于C语言中在C++中无法工作的构造,涵盖了C++20和C23标准中影响兼容性的变化。
C++ 编译器何时可以反虚拟化调用?
探讨 C++ 编译器何时可以对虚函数调用进行去虚拟化,涵盖已知动态类型和 final 关键字等情况,并在 GCC、Clang、MSVC 和 ICC 之间进行比较。
C++26:更多函数包装器
C++26 引入了两个新的函数包装器:std::copyable_function(提供了可复制且 const 正确的 std::function 替代品)和 std::function_ref(一个非拥有、可调用的引用,具有引用语义)。
用C语言搞怪,第&((int*)-8)[3]部分
一篇幽默的教育性文章,涵盖C语言基础知识,如前向声明、运算符优先级、无条件跳转和基本算术运算,并附带有意搞怪的代码示例。
C++中老式C风格void*的优雅与简洁
文章讨论了在C++中使用C风格void*指针与uint8_t*和std::span传递内存块的优缺点,主张void*的简洁性和可读性。