转载: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))))