This example显示了一个名为validate
的函数,该函数在全局范围内重载了boost::program_options
命名空间中的函数。
使用全局函数重载这个设计的理由是什么?为什么boost::program_options
没有实现更严格的设计(例如,重写类方法或其他方案)?
正如下面的评论中所指出的,我的主要关注点是用户可能惊讶地发现他们的一个全局函数正在被库调用。
应该强调的是,命名空间自由函数非常重要(与全局范围的自由函数相反,请参阅Chris Drew提供的this link)。实际上,命名空间,非类(免费)函数是IMO C ++的主要优点。
我的公司正在考虑大力推广Boost,它似乎备受推崇。但是,这个特殊的设计决定让我很担心。
答案 0 :(得分:2)
我认为我的主要惊喜是命名空间中定义的函数可以被全局范围内定义的函数重载(隐藏)。我会问为什么c ++允许这样做以及是否有人认为这是一个缺陷,除非你有一个简单的解释方便。 user2141130 2 hours ago
不,这不能算是一个缺陷。
该功能不会被全局范围内定义的功能隐藏。
这就是Argument Dependent Lookup(ADL)的用途,并且您一直在使用它!你在这里使用它:
std::cout << "Hello world!";
ADL非常微妙且非常普遍。许多人直到他们问你自己刚问过的同样问题时才意识到这一点。免费功能非常适合扩展点。
更多: What is "Argument-Dependent Lookup" (aka ADL, or "Koenig Lookup")?
答案 1 :(得分:1)
通常,不同的boost库具有不同的质量水平。
更具体地说,这涵盖了相对罕见的用户案例。我想有可能以不同的方式实现它,但作者选择了一种快速而简单的路线。虽然我同意全球功能并不完美,但它肯定没有全球变量那么糟糕。这些validate
函数本质上仅限于main.cpp
或类似。
当然,欢迎您建议对库进行改进或使用替代实现。我可以向你保证,在boost中有很多非常有用且设计良好的库,所以让这个例子不要劝阻你。