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;
}
}