#include <iostream> // error
using namespace std;
#include <utility>
#include <type_traits> // Для true_type и false_type
template <typename FROM, typename TO> struct IsConvertibleHelper
{
private:
static void aux(TO);
template <typename F, typename, typename = decltype (aux(declval<F>()))> static std::true_type test(void*);
template <typename, typename> static std::false_type test(...);
public:
using Type = decltype(test<FROM, TO>(nullptr));
};
template<typename FROM, typename TO> struct IsConvertibleT : IsConvertibleHelper<FROM, TO>::Type {};
template<typename FROM, typename TO> using IsConvertible = typename IsConvertibleT<FROM, TO>::Type; //тип
template<typename FROM, typename TO> constexpr bool isconvertible = IsConvertibleT<FROM, TO>::value; // да нет бул
template<bool, typename T = void> struct EnableIfT {};
template<typename T> struct EnableIfT<true, T> { using Type = T;};
template<bool Cond, typename T = void> using EnableIf = typename EnableIfT<Cond, T>::Type;
//template <typename Iterator> constexpr bool IsRandomAccessIterator = IsConvertible <typename std::iterator_traits<Iterator>::iterator_category, std::random_access_iterator_tag >::Type;
template <typename Iterator> constexpr bool IsRandomAccessIterator = IsConvertible <typename std::iterator_traits<Iterator>::iterator_category, std::random_access_iterator_tag >::value;
template<typename Iterator, typename Distance> EnableIf<IsRandomAccessIterator<Iterator>>advancelter(Iterator & x, Distance n) { x += n;}
int main() {
}