#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(); // 防止T构造函数是private时构造失败
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; // 1
std::cout<<IsConvertable<int,double>::exists<<std::endl; // 1
std::cout<<IsConvertable<Derived,Base>::exists<<std::endl;// 1
std::cout<<IsConvertable<Base,Derived>::exists<<std::endl; // 0
std::cout<<IsConvertable<std::string,int>::exists<<std::endl;// 0
std::cout<<"<<<<<<<<<<<<<<<<<"<<std::endl;
std::cout<<IsConvertable<double,int>::exists2Way<<std::endl; // 1
std::cout<<IsConvertable<int,double>::exists2Way<<std::endl; // 1
std::cout<<IsConvertable<Derived,Base>::exists2Way<<std::endl;// 0
std::cout<<IsConvertable<Base,Derived>::exists2Way<<std::endl; // 0
std::cout<<IsConvertable<std::string,int>::exists2Way<<std::endl;// 0
}
int main(){
Test();
}
C++ 校验类型是否相互转换
最新推荐文章于 2023-02-03 14:20:43 发布
该博客内容涉及C++编程,介绍了一个模板类`IsConvertible`,用于检测两种类型之间是否可以进行隐式转换。通过`Test`函数的静态成员变量`exists`和`exists2Way`来判断类型间的转换关系,例如`double`到`int`,`Derived`到`Base`等。此外,还展示了如何在`main`函数中使用这个模板类进行测试。
2326

被折叠的 条评论
为什么被折叠?



