#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, std::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);
}
};