为什么发明了依赖于参数的查找?

fre*_*low 9 c++ history argument-dependent-lookup

为什么发明了依赖于参数的查找(ADL)?是这样我们可以写cout << stuff而不是std::operator<<(cout, stuff)?如果是这种情况,为什么ADL不限于运营商而不是所有功能?

如果C++有其他方法来执行内置和用户定义类型的通用输出,例如类型安全的printf可变参数模板,是否可以防止引入ADL ?

Dan*_*röm 12

发明ADL是为了允许接口原理:

接口原理

对于类X,所有函数,包括自由函数,都是

  • "提"X,和
  • 是"提供"X

在逻辑上是X的一部分,因为它们构成X的接口的一部分.

查看Herb Sutter 关于该主题的出色的本周大师.


Kon*_*lph 7

如果是这种情况,为什么ADL不限于运营商而不是所有功能?

为什么人为地限制它?ADL可能很难实现(当与C++的重载规则结合使用时)1但它是一种非常有用的技术.一方面,它也可以在函数上运行,这使得在不导入整个命名空间的情况下使用其他命名空间变得更加容易.

例如,SeqAn库:

using seqan::String;
String<Char> url = "http://www.seqan.de/";
std::cout << "The URL " << url << " has length " << length(url) << std::endl;
Run Code Online (Sandbox Code Playgroud)

请注意,我使用了该函数seqan::length而没有限定其全名.无论如何,ADL发现它.SeqAn库过度使用此类命名空间作用域函数,并且使用命名空间名称前缀每个用法都是不切实际的.同样,通常不建议导入命名空间.

对于许多其他库来说,情况也是如此,例如Boost的大多数库.


1我认为委员会没有立即意识到这一点.


Mat*_* M. 5

为什么不将其限制于运营商?

让我们看一个简单的通用算法:

template <typename FwdIt, typename T>
FwdIt remove(FwdIt first, FwdIt last, T const& value)
{
  using std::swap;

  FwdIt result = first;
  for ( ; first != last; ++first)
    if (!(*first == value)) swap(*result++, *first);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

它如何与自定义类型及其自己的版本一起使用 swap?感谢ADL

正如Daniel所提到的,这就是Sutter所称的接口原理