C++ 11 模板萃取
直接上代码:
首先定义枚举类型
enum RELATION_SHIP {SINGLE,MULTI
};enum TRANS_MODE {UNICAST,BROARDCAST
};
定义空结构体,用于携带类型信息(模板参数)
template<RELATION_SHIP, RELATION_SHIP, TRANS_MODE>
struct WR{};
声明主模板
template<typename T>
struct Relation_Traint;
这里是前向声明,用于告诉编译器,后面会进行Relation_Traint<T>的特化定义(如:针对 WR<rp, rc, tm>的全
特化版本)
template<RELATION_SHIP rp, RELATION_SHIP rc, TRANS_MODE tm>
struct Relation_Traint<WR<rp, rc, tm>> {static constexpr bool is_muti_p = (rp == MULTI);static constexpr bool is_muti_c = (rc == MULTI);static constexpr bool is_broadcast = (tm == BROARDCAST);
};
针对 Policy<Flag>
的模板模板参数
template<template<typename> class Policy, typeName Flag>
struct Relation_Traint<Policy<Flag>> : Relation_Traint<Flag>{};
这个特化是为了支持 策略类包装器,下面进行举例说明:
template<typename>
struct MyPolicy{};using MyType = MyPolicy<WR<MULTI,MULTI,BROADCAST>>;void Func(){if(Relation_Traint<MyType>::is_muti_p == true){cout<<"Is MULTI"<<endl;
}
}
Relation_Traint<Policy<Flag>>
通过继承 Relation_Traint<Flag>
,实现了“透明转发”,即忽略 Policy
外壳,直接看内部的 Flag