#pragma once #include struct NoTriviallyConstructible{ NoTriviallyConstructible() = delete; explicit NoTriviallyConstructible(int a) {} }; struct NoCopyConstructible { NoCopyConstructible() = default; NoCopyConstructible(const NoCopyConstructible& a) = delete; NoCopyConstructible(const NoCopyConstructible&& a) = delete; }; template <> struct Convert { int operator()(const NoTriviallyConstructible& a) { return 1; } }; template <> struct Convert { NoTriviallyConstructible operator()(const NoCopyConstructible& a) { return NoTriviallyConstructible(1); } }; template struct Convert {}; template struct is_customly_convertible{ private: template static decltype(std::declval>().operator()(C())) detect(Convert); static void detect(...); public: static constexpr bool value = std::is_same>()))>::value; };