C++侦测类型转换性

在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 节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值