C++:enable_if与模板偏特化的学习与实践

由于项目的的旧代码不堪入目,只能一块块进行重构,最近找一个结构换json的开源库xpack,为了方便使用,对他封装了一下。

但是并不是所有结构体都可以直接使用xpack生成json串,结合最近学到的新东西,我对封装类进行了改造。

话不多说,先上代码:

#prama once

template<typename T>
struct is_x_pack
{
    template<typename U,typename = decltype(U::xxx)> struct HELPS;
    template<typename U> static void Specify(HELPS<U,decltype(U::xxx)>*);
    template<typename U> static bool Specify(...);
    const static bool is = std::is_void<decltype(Specify<U>(nullptr))>::value;
};

//最终这个类在实例化的时候,会根据上面的规则来拦截实例化
template<typname T,typename = std::enable_if<is_x_pack<T>::is,bool>::type>
sturct Parser : public T
{


}

is_x_pack的主要作用就是通过实际特化的函数版本来决定成员is的值,然后其他类通过is_x_pack<T>::is配合enable_if来限制实例化。

当尝试用非x_pack指定类型的类进行Parser的实例化时,比如Parser<int>,由于Parse的第二个模板参数没办法推导出对应的参数类型,而导致编译报错。(当然如果你要传Parser<int,int>,这样也是能通过编译,这种情况也可以在Pasrer做一下第二个模板参数的判断即可)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值