直接上代码:
首先定义枚举类型
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
662

被折叠的 条评论
为什么被折叠?



