#include <iostream>
template<class T, class U>
class IsConvertable{
private:
typedef char Small;
class Big { char dummy[2];};
static Small Test(U);
static Big Test(...);
static T MakeT();
public:
enum {exists = sizeof(Test(MakeT())) == sizeof(Small)};
enum {exists2Way = exists && IsConvertable<U,T>::exists};
};
struct Base{};
struct Derived: public Base{
int a;
};
void Test(){
std::cout<<IsConvertable<double,int>::exists<<std::endl;
std::cout<<IsConvertable<int,double>::exists<<std::endl;
std::cout<<IsConvertable<Derived,Base>::exists<<std::endl;
std::cout<<IsConvertable<Base,Derived>::exists<<std::endl;
std::cout<<IsConvertable<std::string,int>::exists<<std::endl;
std::cout<<"<<<<<<<<<<<<<<<<<"<<std::endl;
std::cout<<IsConvertable<double,int>::exists2Way<<std::endl;
std::cout<<IsConvertable<int,double>::exists2Way<<std::endl;
std::cout<<IsConvertable<Derived,Base>::exists2Way<<std::endl;
std::cout<<IsConvertable<Base,Derived>::exists2Way<<std::endl;
std::cout<<IsConvertable<std::string,int>::exists2Way<<std::endl;
}
int main(){
Test();
}