为什么 Boost 使用全局函数覆盖来实现自定义验证程序"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中有许多非常有用且设计良好的库,因此请不要让这个示例使您气馁。

最新更新