C++11 模板元编程(5)-模板匹配(if else分支选择)

转载https://www.jianshu.com/p/b56d59f77d53

1.基础元函数IfThenElse

template<typename Condition, typename Then, typename Else> struct IfThenElse;

template<typename Then, typename Else>
struct IfThenElse<TrueType, Then, Else>
{
    using Result = Then;
};

template<typename Then, typename Else>
struct IfThenElse<FalseType, Then, Else>
{
    using Result = Else;
};

#define __if(...) typename IfThenElse<__VA_ARGS__>::Result

// IfThenElse实现了一个元函数LargerType,它能够返回两个类型中内存空间更大的那个。
template<typename T, typename U>
using LargerType = __if(__bool(sizeof(T) > sizeof(U)), T, U);

2.函数重载来完成模式匹配

某些类型之间支持默认转型,我们定义这个元函数的的原型为:IsConvertible :: (typename T -> typename U) -> BoolType

template<typename T, typename U>
struct IsConvertible
{
private:
    using  Yes = char;
    struct No { char dummy[2]; };

    static Yes test(U);    // 函数重载,T能默认则会用U
    static No  test(...);
    // 用self函数替代类型T的对象传入test,在编译期就能获得结果,而且避免了创建对象的开销
    static T self();

public:
    using Result = BoolType<sizeof(test(self())) == sizeof(Yes)>;
};

#define __is_convertible(...)  typename IsConvertible<__VA_ARGS__>::Result

#define __is_both_convertible(T, U) \
    __and(__is_convertible(T, U), __is_convertible(U, T))

//
__is_convertible(char, int)   // 返回__true()
__is_convertible(char, void*) // 返回__false()
__is_convertible(char*, void*)// 返回__true()
__is_convertible(Base*, Derived*) // 返回__false()
__is_convertible(Derived*, Base*) // 返回__true()

// __is_base_of(),用来判断一个类型是否是另一个的父类
#define __is_base_of(T, U)                      \
__and(__is_convertible(const U*, const T*)          \
      __and(__not(__is_eq(const T*, const void*)),          \
            __not(__is_eq(const T, const U))))

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值