
AMDG David Abrahams <dave <at> boost-consulting.com> writes:
template <class T> void koenig_swap(T& left, T& right) { using std::swap; swap(left,right); }
Several boost libraries (multi array, compressed pair, graph, optional, spirit) already use this technique, each time explicitly with 'using std::swap' instead of abstracting it out.
The appropriate name for that function is boost::swap
To prevent infinite recursion or ambiguity we need: namespace boost_swap_impl { template<class T> void swap_impl(T& left, T&, right) { using std::swap; swap(left, right); } } namespace boost { namespace swap_adl_barrier { template<class T> void swap(T& left, T& right) { ::boost_swap_impl::swap_impl(left, right); } } using swap_adl_barrier::swap; } In Christ, Steven Watanabe