#pragma once
#include <exception>
struct NoTriviallyConstructible {
NoTriviallyConstructible() = delete;
};
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 obj;
NoTriviallyConstructible operator()(const NoCopyConstructible &a) const {
return obj;
}
};
template<typename T0, typename T>
struct is_customly_convertible {
template<typename T1>
static void detect(...);
template<typename T1>
static char
detect(decltype(&T1::operator()));
static constexpr bool value = !std::is_same<void,
decltype(detect<Convert<T0, T>>(0))>::value;
};