#pragma once
#include <exception>

struct NoTriviallyConstructible {
  NoTriviallyConstructible() = delete;
};

struct NoCopyConstructible {
  NoCopyConstructible(const NoCopyConstructible &) = delete;
  NoCopyConstructible& operator=(const NoCopyConstructible&) = delete;
};

template<>
struct Convert<NoTriviallyConstructible, int> {
  int operator()(const NoTriviallyConstructible &a) {
    return 0;
  }
};

template<>
struct Convert<NoCopyConstructible, NoTriviallyConstructible> {
  NoTriviallyConstructible obj;
  NoTriviallyConstructible operator()(const NoCopyConstructible &a) const {
    return obj;
  }
};

template<typename T0, typename T>
struct is_customly_convertible {
  template<typename T1>
  static void detect(...);

  template<typename T1>
  static char
  detect(decltype(&T1::operator()));

  static constexpr bool value = !std::is_same<void,
  decltype(detect<Convert<T0, T>>(0))>::value;
};