template class is_customly_convertible { struct char2 { char c[2]; }; template static char test(decltype(&C::operator())); template static char2 test(...); public: enum { value = sizeof(test>(0)) == sizeof(char) }; }; class NoCopyConstructible { public: NoCopyConstructible(const NoCopyConstructible&) = delete; NoCopyConstructible& operator=(const NoCopyConstructible&) = delete; }; class NoTriviallyConstructible { public: NoTriviallyConstructible() = delete; }; template<> struct Convert { int operator()(const int &a) { return a; } }; template<> struct Convert { int operator()(const int &a) { return a; } };