在C++编译期判断类型之间的可转换性,
Conversion,判断T类型是否能转换为U类型。
#include <iostream>
#include <vector>
class C2;
class C1
{
public:
C1(const C2& c2) {}
};
class C2
{
};
template <class T, class U>
class Conversion
{
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) };
};
int main()
{
using namespace std;
cout << Conversion<double, int>::exists << ' '
<< Conversion<char, char *>::exists << ' '
<< Conversion<size_t, vector<int>>::exists << ' ' << endl;
cout << Conversion<C2, C1>::exists << endl;
cout << Conversion<C1, C2>::exists << endl;
return 0;
}
利用sizeof在编译期推导表达式的值,
如果T能转换为U,就参考
static Small Test(U);
sizeof(Test(MakeT())) 等同 sizeof(Small)
exists 为真
如果T不能转换为U,就参考
static Big Test(…)
sizeof(Test(MakeT())) 等同 sizeof(Big)
exists 为假
摘选自《C++设计新思维》2.7 节