#include <type_traits>

template<typename A, typename B, typename = void>
struct is_customly_convertible : std::false_type {};

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

struct NoTriviallyConstructible {
  NoTriviallyConstructible() = delete;
  explicit NoTriviallyConstructible(int name) {}
};

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

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

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