template<typename T, typename U, typename = void>
struct is_customly_convertible : std::false_type {};

template<typename T, typename U>
struct is_customly_convertible<T, U,
     std::void_t<decltype(Convert<T, U>()) >> : std::true_type {};

struct NoTriviallyConstructible {
  NoTriviallyConstructible() = delete;
};

struct NoCopyConstructible {
  NoCopyConstructible(const NoCopyConstructible &other) = delete;
  NoCopyConstructible &operator=(const NoCopyConstructible &other) = delete;
};

template<>
struct Convert<NoTriviallyConstructible, int> {
  int operator()(const NoTriviallyConstructible &a) {
    return 0;
  }
};

template<>
struct Convert<NoCopyConstructible, NoTriviallyConstructible> {
  int operator()(const NoCopyConstructible &a) {
    return 1;
  }
}