#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 struct is_customly_convertible { template static void detect(...); template static decltype(T1().operator()(0)) detect(decltype(&T1::operator())); template static decltype(T1().operator()({0, 0})) detect(decltype(&T1::operator())); static constexpr bool value = !std::is_same>(0))>::value; };