Using the Koenig lookup - Argument dependent name lookup (ADL)

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.
}