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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值