#include template struct is_customly_convertible : std::false_type {}; template struct is_customly_convertible())>> : std::true_type {}; struct NoTriviallyConstructible { NoTriviallyConstructible() = delete; explicit NoTriviallyConstructible(int name) {} }; 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 operator()(const NoCopyConstructible& a) { return NoTriviallyConstructible(0); } };