Демонстрирует версию<std::iter_swap>, которая использует черты типа, чтобы определить, являются ли аргументы прокси-итераторами или нет, если они не являются, то это просто делает<std::swap>из него исключенных аргументов (то же, что и<std::iter_swap>), однако если они являются прокси-итераторами, то особое внимание уделяется свопу, чтобы гарантировать, что алгоритм работает правильно для обоих прокси-итераторов и даже итераторов разных типов (см.iter_swap_example.cpp).:
//// iter_swap:// tests whether iterator is a proxy iterator or not, and// uses optimal form accordingly://namespacedetail{template<typenameI>staticvoiddo_swap(Ione,Itwo,constboost::false_type&){typedeftypenamestd::iterator_traits<I>::value_typev_t;v_tv=*one;*one=*two;*two=v;}template<typenameI>staticvoiddo_swap(Ione,Itwo,constboost::true_type&){usingstd::swap;swap(*one,*two);}}template<typenameI1,typenameI2>inlinevoiditer_swap(I1one,I2two){//// See is both arguments are non-proxying iterators, // and if both iterator the same type://typedeftypenamestd::iterator_traits<I1>::referencer1_t;typedeftypenamestd::iterator_traits<I2>::referencer2_t;typedefboost::integral_constant<bool,::boost::is_reference<r1_t>::value&&::boost::is_reference<r2_t>::value&&::boost::is_same<r1_t,r2_t>::value>truth_type;detail::do_swap(one,two,truth_type());}
Статья An improved Version of std::iter_swap раздела Chapter 1. Boost.TypeTraits Examples может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.