c++-模板元编程TypeList进阶操作Accumulate

前置课程
c++模板元编程TypeList定义及基本操作

#include "def.h"

template<typename List, template<class, class> typename MetaFunc, typename Init, bool = IsEmpty_v<List>>
struct Accumulate_;

template<typename List, template<class, class> typename MetaFunc, typename Init>
struct Accumulate_<List, MetaFunc, Init, true> {
    using type = Init;
};

template<typename List, template<class, class> typename MetaFunc, typename Init>
struct Accumulate_<List,MetaFunc,Init, false>
        : public Accumulate_<
        PopFront_t<List>,
        MetaFunc,
        typename MetaFunc<Init, Front_t<List>>::type> {};

template<typename List, template<class, class> typename MetaFunc, typename Init>
using Accumulate_t = typename Accumulate_<List, MetaFunc, Init>::type;

// 实践一
// 实现逆序 reverse
template<typename Source, typename Des = TypeList<>>
struct Reverse_Acc_ {
    using type = Accumulate_t<Source, PushFront_, Des>;
};

template<typename Source, typename Des = TypeList<>>
using  Reverse_Acc_t = typename Reverse_Acc_<Source, Des>::type;

// 实践二 最大的类型
// 辅助类
template<typename T>
struct Identity {
    using type = T;
};

template<typename Init, typename Current>
struct BiggerType_ {
    // Identity减少分支实例
    using type = typename conditional_t<sizeof(Init) >=sizeof(Current), Identity<Init>, Identity<Current>>::type;
};

template<typename Init, typename Current>
using BiggerType_t = typename BiggerType_<Init, Current>::type;

template<typename Source, typename Des = char>
struct BiggestType_{
    using type = Accumulate_t<Source, BiggerType_, Des>;
};

template<typename Source, typename Des = char>
using BiggestType_t = typename BiggestType_<Source, Des>::type;

struct Big {
    char buffer[1024];
};


int main() {
    // 逆序测试
    using SL = TypeList<Big, int, char, long long>;
    using Reverse_SL = Reverse_Acc_t<SL>;
    cout << boost::typeindex::type_id_with_cvr<Reverse_SL>().pretty_name()<< endl;

    // 最大类型测试
    using Biggest_SL = BiggestType_t<SL>;
    cout << boost::typeindex::type_id_with_cvr<Biggest_SL>().pretty_name()<< endl;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值