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
