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

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

1.基础元函数IfThenElse

template struct IfThenElse;

template
struct IfThenElse
{
    using Result = Then;
};

template
struct IfThenElse
{
    using Result = Else;
};

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

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

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

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

template
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;
};

#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))))

 

你可能感兴趣的:(c++)