为什么 Boost 使用全局函数覆盖来实现自定义验证程序"Program Options"
Why Does Boost Use a Global Function Override to Implement Custom Validators in "Program Options"
这个例子展示了一个在全局作用域定义的名为validate
的函数重载了boost::program_options
命名空间中的函数。
使用全局函数重载的设计理由是什么?为什么boost::program_options
没有实现更紧密作用域的设计(例如覆盖类方法或其他方案)?
正如在下面的注释中所指出的,我主要关心的是用户可能会惊讶地发现他们的一个全局函数被库调用。
应该强调的是,命名空间自由函数是极其重要的(与全局作用域自由函数相反,请参阅Chris Drew提供的链接)。的确,命名空间、非类(自由)函数是c++的主要优点。
我的公司正在考虑大规模采用Boost,它似乎受到高度重视。但是,这个特殊的设计决定让我很担心。
我认为最让我惊讶的是定义在命名空间中的函数可以被定义在全局作用域的函数重载(隐藏)。我要问为什么c++允许这样做,如果你手边没有一个简短的解释,是否有人会认为这是一个缺陷。User2141130 2 hours ago
不,这不能被认为是一个缺陷。
函数不会被全局作用域定义的函数隐藏。
这就是参数依赖查找(ADL)的作用,你一直在使用它!可以在这里使用:
std::cout << "Hello world!";
ADL是非常微妙和普遍的。很多人都没有意识到这一点,直到他们问了自己你刚才问的同样的问题。自由函数在扩展点上工作得很好。
更多:什么是"参数依赖查找"(又名ADL,或"柯尼格查找")?
一般来说,不同的boost库具有不同的质量水平。
更具体地说,这涵盖了相对罕见的用户用例。我想可能会有不同的实现方式,但作者选择了一个快速而简单的路线。虽然我同意全局函数并不完美,但它肯定不如全局变量那么糟糕。这些validate
函数本质上仅限于main.cpp
或类似的功能。
当然,欢迎您对库提出改进建议或使用替代实现。我可以向您保证,boost中有许多非常有用且设计良好的库,因此请不要让这个示例使您气馁。
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- std::ranges::elements_view,用于自定义类似元组的数据
- 创建具有验证和语法突出显示的自定义 printf
- boost::p rogram_options 自定义验证和默认值
- boost program_options自定义验证
- 提升标准::矢量<double>的自定义验证器
- 提升程序选项:自定义验证器是否需要重载运算符>>?
- 自定义验证器不允许default_value
- 用于提升program_options的自定义验证器不适用于 GCC,适用于 MSVC
- 为什么 Boost 使用全局函数覆盖来实现自定义验证程序"Program Options"
- 自定义Windows身份验证包