下面的类完成在编译时检查类型T是否可以转化成类型U:
template <class T, class U>
class Conversion
{
public:
enum
{
/*这里很巧妙:MakeT()返回一个T类型,此时如果T可以转化成U,那么会调用static Small Test(U);返回一个Small类型,从而exists会在编译期间就被确定成1;如果T不能转化成U,则会调用static Big Test(...)返回一个Big类型,从而exists会在编译期间就被确定成0*/
exists = sizeof(Test(MakeT()))==sizeof(Small)
};
enum
{
sameType = false;
};
private:
typedef char Small;
class Big { char dummy[2]; };
static Small Test(U);
static Big Test(...);
static T MakeT();
};
//针对同一类型的模板特化
typename <class T>
class Conversion<T,T>
{
public:
enum { exists = 1, sameType = 1 };
};
int main()
{
std::cout << Conversion<double, int>::exists <<
<< Conversion<char, char*>::exists <<
<< Conversion<std::vector<int>,std::list<int> >::exists
<< std::endl;
return 0;
}
版权归原作者所有!