#pragma once #include struct NoTriviallyConstructible { NoTriviallyConstructible() = delete; }; struct NoCopyConstructible { NoCopyConstructible(const NoCopyConstructible &) = delete; NoCopyConstructible& operator=(const NoCopyConstructible&) = delete; }; template<> struct Convert { int operator()(const NoTriviallyConstructible &a) { return 0; } }; template<> struct Convert { NoTriviallyConstructible obj; NoTriviallyConstructible operator()(const NoCopyConstructible &a) const { return obj; } }; template struct is_customly_convertible { template static void detect(...); template static char detect(decltype(&T1::operator())); static constexpr bool value = !std::is_same>(0))>::value; };