#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <algorithm>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
struct NoTriviallyConstructible {
public:
NoTriviallyConstructible(int one, float two) {}
int vl = 1;
private:
NoTriviallyConstructible() = delete;
};
struct NoCopyConstructible {
public:
NoCopyConstructible() = default;
int vl = 1;
private:
NoCopyConstructible(const NoCopyConstructible&) = delete;
void operator=(const NoCopyConstructible&) = delete;
};
template <class A, class B>
struct Convert;
template <>
struct Convert<NoTriviallyConstructible, int> {
int operator()(const NoTriviallyConstructible& as) {
return as.vl;
}
};
template <>
struct Convert<NoCopyConstructible, NoTriviallyConstructible> {
NoTriviallyConstructible operator()(const NoTriviallyConstructible& as) {
return NoTriviallyConstructible(as.vl, 0.1);
}
};
template <typename L, typename R>
class is_customly_convertible {
template <typename A, typename B>
static char test(decltype(&Convert<A, B>::operator()));
template <typename A, typename B>
static int test(...);
public:
enum { value = sizeof(test<L, R>(0)) == sizeof(char) };
};