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