由于项目的的旧代码不堪入目,只能一块块进行重构,最近找一个结构换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做一下第二个模板参数的判断即可)