Un par de preguntas sobre boost::swap
. Por favor, consulte el siguiente código, que es básicamente un método de cortar y pegar de boost/swap.hpp
. Me refiero a la versión de la biblioteca 1.43.0.Pregunta sobre boost :: swap
namespace boost_swap_impl
{
template<class T>
void swap_impl(T& left, T& right)
{
using namespace std;//use std::swap if argument dependent lookup fails
swap(left,right);
}
template<class T, std::size_t N>
void swap_impl(T (& left)[N], T (& right)[N])
{
for (std::size_t i = 0; i < N; ++i)
{
::boost_swap_impl::swap_impl(left[i], right[i]);
}
}
}
namespace boost
{
template<class T1, class T2>
void swap(T1& left, T2& right)
{
::boost_swap_impl::swap_impl(left, right);
}
}
- ¿Por qué se
boost::swap
declarados comotemplate <typename T1, typename T2>
cuando en el resto del código que es todo tratando con el mismo tipo? - Si defino mi propia función global
void swap(T&, T&)
Veo que es la función global que se llama desdeswap_impl(T& left, T& right)
. ¿No es esto un conflicto y, por lo tanto, una condición de error ya queswap_impl
también usanamespace std
que tiene swap definido?
@jam: +1. ¿Podría indicarme la sección estándar de referencia de C++ que habla sobre la precedencia de la no plantilla sobre el código de la plantilla? – Fanatic23
@ Fanatic23: Respuesta editada con cita estándar. – ildjarn
@ildjarn: me temo que su nota es [bajo contención] (http://stackoverflow.com/questions/9170247/does-c11-change-the-behavior-of-explicitly-calling-stdswap-to-ensure- adl-loc). Pensé que también era el caso, pero quizás no. – GManNickG