1 August 2005
The Koenig lookup or Argument dependent name lookup (ADL), can be used in many situations.
I am going to show one example that I think in quite useful. Imagine one class where you want to declare the operator << to use with streams. If you are using templates, you should provide the operator << for each type that you instantiate. Using the ADL this is not necessary, because the declaration of the function can be done inline inside a class type.
template<class T>
class X
{
T m_value;
friend std::ostream & operator << (std::ostream &os, const X & x)
{
os << x.m_value;
return os;
}
friend void swap(X &a, X & b)
{
X temp(b);
a = b;
b = temp;
}
public:
X(const T& v) : m_value(v){}
};
int main()
{
X<double> x(2.3);
cout << x;
X<double> y(1);
swap(x, y);
std::swap(x,y); // compare with this one.
}