当前位置: 首页 > wzjs >正文

网站建设 上海网站永久免费网站怎么建

网站建设 上海网站,永久免费网站怎么建,看不到图片 wordpress,网站建设资料需要公司提交的吗文章最后给出了汇总的代码,可直接运行 1. typelist是什么 typelist是一种用来操作类型的容器。和我们所熟知的vector、list、deque类似,只不过typelist存储的不是变量,而是类型。 typelist简单来说就是一个类型容器,能够提供一…

文章最后给出了汇总的代码,可直接运行

1. typelist是什么

typelist是一种用来操作类型的容器。和我们所熟知的vector、list、deque类似,只不过typelist存储的不是变量,而是类型。

typelist简单来说就是一个类型容器,能够提供一系列的操作。

本文将展示使用元编程实现typelist。

2. 要实现的typelist的接口

在此列举一下即将要编写的typelist的所有接口:

  • typelist:要实现的容器类型。
  • front<typelist>:获取容器中的第一个元素。
  • size<typelist>:获取容器的元素数量。
  • pop_front<typelist, elem>:移出第一个元素。
  • push_front<typelist, elem>:向开头插入一个元素。
  • push_back<typelist, elem>:向结尾插入一个元素。
  • replace_front<typelist, elem>:替换第一个元素。
  • is_empty<typelist>:判断是否为空。
  • find<typelist, index>:查找下标为index的元素。
  • get_maxsize_type<typelist>:容器中尺寸(sizeof)最大的元素。
  • reverse<typelist>:翻转容器中的元素。 
  • filter<typelist, Pre>:根据谓词Pre来过滤typelist中的类型。Pre应该是一个类模板,接受一个类型模板参数,并拥有一个bool类型的静态变量value,value为false时将该类型剔除typelist。

3. 接口实现

3.1 容器

template<typename... Elems>
struct typelist{};

3.2 front<typelist>

template<typename TPLT>// typelist的简写
struct front;struct front<typelist<FirstElem, OtherElems...>>
{using type = FirstElem;
};

3.3 size<typelist>

template<typename TPLT>
struct size;template<typename... Elems>
struct size<typelist<Elems...>>
{static inline const value = sizeof...(Elems);
};

3.4 pop_front<typelist, elem>

template<typename TPLT>
struct pop_front;template<typename FirstElem, typename... OtherElems>
struct pop_front<typelist<FirstElem, OtherElems...>
{using type = typelist<OtherrElems...>;
};

3.5 push_front<typelist, elem>

template<typename TPLT, typename newElem>
struct push_front;template<typename... Elems, typename newElem>
struct push_front<typelist<Elems...>, newElem>
{using type = typelist<newElem, Elems...>;
};

3.6 push_back<typelist, elem>

template<typename TPLT, typename newElem>
struct push_back;template<typename... Elems, typename newElem>
struct push_back<typelist<Elems...>, newElem>
{using type = typelist<Elems..., newElem>;
};

3.7 replace_front<TPLT, elem>

template<typename TPLT, typename Elem>
struct replace_front;template<typename FirstElem, typename... OtherElems, typename Elem>
struct replace_front<typelist<FirstElem, OtherElems...>, Elem>
{using type = typelist<Elem, OtherElems...>;
};

3.8 is_empty<TPLT>

template<typename TPLT>
struct is_empty;template<typename... Elems>
struct is_empty
{static inline const bool value = sizeof...(Elems) == 0;
};

3.9 find<typelist, index>

template<typename TPLT, size_t index>
struct find : find<typename pop_front<TPLT>::type, index - 1>
{};template<typename TPLT>
struct find<TPLT, 0> :front<TPLT>
{
};

3.10 get_maxsize_type<typelist>

template<typename TPLT>
struct get_maxsize_type
{
private:using FirstType = typename front<TPLT>::type;using RemainLT = typename pop_front<TPLT>::type;using RemainMaxType = typename get_maxsize_type<RemainLT>::type;
public:using type = conditional_t < (sizeof(FirstType) > sizeof(RemainMaxType)),FirstType, RemainMaxType >;
};template<typename Elem>
struct get_maxsize_type<typelist<Elem>>
{using type = Elem;
};template<>
struct get_maxsize_type<typelist<>>;

3.11 reverse<typelist>

template<typename TPLT>
struct reverse
{
private:using FirstElem = typename front<TPLT>::type;using RemainTL = typename pop_front<TPLT>::type;using ReversedRemainTL = typename reverse<RemainTL>::type;
public:using type = typename push_back<ReversedRemainTL, FirstElem>::type;
};template<>
struct reverse<typelist<>>
{using type = typelist<>;
};

template<typename TPLT, bool = is_empty<TPLT>::value>
struct reverse;template<typename TPLT>
struct reverse<TPLT, false>
{
private:using FirstElem = typename front<TPLT>::type;using RemainTL = typename pop_front<TPLT>::type;using ReversedRemainTL = typename reverse<RemainTL>::type;
public:using type = typename push_back<ReversedRemainTL, FirstElem>::type;
};template<typename TPLT>
struct reverse<TPLT, true>
{using type = typelist<>;
};

3.12 filter<typelist, Pre>

// 根据谓词过滤元素,谓词应该是一个类模板,接受一个类型参数,并且具有静态bool变量,false表示过滤掉该类型
template<typename TPLT, template<typename>typename Pre>
struct filter;template<typename FirstElem, typename... OtherElems, template<typename>typename Pre>
struct filter<typelist<FirstElem, OtherElems...>, Pre>
{
private:using RemainFilteredTL = typename filter<typelist<OtherElems...>, Pre>::type;
public:using type = std::conditional_t< Pre<FirstElem>::value,typename push_front<RemainFilteredTL, FirstElem>::type,RemainFilteredTL >;
};template<template<typename>typename Pre>
struct filter<typelist<>, Pre>
{using type = typelist<>;
};
// 测试使用的类模板,用以剔除某个指定的类型
template<typename InputType, typename FilterType = double>
struct test_filter
{static constexpr bool value = !std::is_same_v<InputType, FilterType>;  //如果类型是int,就输出false,int不通过
};

 

4. 完整代码

#include <iostream>
#include <type_traits>
#include "typegetter.hpp"using namespace std;/**/namespace myTypeList
{template<typename... Elems>struct typelist {};template<typename TPLT>struct front;template<typename FirstElem, typename... OtherElems>struct front < typelist<FirstElem, OtherElems...>>{using type = FirstElem;};template<typename TPLT>struct size;template<typename... Elems>struct size<typelist<Elems...>>{static const inline size_t value = sizeof...(Elems);};template<typename TPLT>struct is_empty;template<typename... Elems>struct is_empty<typelist<Elems...>>{static constexpr bool value = sizeof...(Elems) == 0;};template<typename TPLT>struct pop_front;template<typename FirstElem, typename... OtherElems>struct pop_front< typelist<FirstElem, OtherElems...> >{using type = typelist<OtherElems...>;};template<typename TPLT, typename newElem>struct push_front;template<typename... Types, typename newElem>struct push_front<typelist<Types...>, newElem>{using type = typelist<newElem, Types...>;};template<typename TPLT, typename newElem>struct push_back;template<typename... Types, typename newElem>struct push_back<typelist<Types...>, newElem>{using type = typelist<Types..., newElem>;};template<typename TPLT, typename newElem>struct replace_front;template<typename FirstElem, typename... OtherElems, typename newElem>struct replace_front<typelist<FirstElem, OtherElems...>, newElem>{using type = typelist<newElem, OtherElems...>;};template<typename TPLT, size_t index>struct find : find<typename pop_front<TPLT>::type, index - 1>{};/*和下面的写法是等价的template<typename TPLT, size_t index>struct find{using type = typename find<typename pop_front<TPLT>::type, index - 1>::type;};*/template<typename TPLT>struct find<TPLT, 0> :front<TPLT>{};/*get_maxsize_type: 获取typelist中尺寸最大的类型*/template<typename TPLT>struct get_maxsize_type{private:using FirstElem = typename front<TPLT>::type;using RemainLT = typename pop_front<TPLT>::type;using RemainMaxElem = typename get_maxsize_type<RemainLT>::type;public:using type = conditional_t < (sizeof(FirstElem) > sizeof(RemainMaxElem)),FirstElem, RemainMaxElem >;};template<typename Elem>struct get_maxsize_type<typelist<Elem>>{using type = Elem;};template<>struct get_maxsize_type<typelist<>>;/*reverse: 翻转typelist*//*// 版本一template<typename TPLT>struct reverse{private:using FirstElem = typename front<TPLT>::type;using RemainTL = typename pop_front<TPLT>::type;using ReversedRemainTL = typename reverse<RemainTL>::type;public:using type = typename push_back<ReversedRemainTL, FirstElem>::type;};template<>struct reverse<typelist<>>{using type = typelist<>;};*/template<typename TPLT, bool = is_empty<TPLT>::value>struct reverse;template<typename TPLT>struct reverse<TPLT, false>{private:using FirstElem = typename front<TPLT>::type;using RemainTL = typename pop_front<TPLT>::type;using ReversedRemainTL = typename reverse<RemainTL>::type;public:using type = typename push_back<ReversedRemainTL, FirstElem>::type;};template<typename TPLT>struct reverse<TPLT, true>{using type = typelist<>;};// 根据谓词过滤元素,谓词应该是一个类模板,接受一个类型参数,并且具有静态bool变量,false表示过滤掉该类型template<typename TPLT, template<typename>typename Pre>struct filter;template<typename FirstElem, typename... OtherElems, template<typename>typename Pre>struct filter<typelist<FirstElem, OtherElems...>, Pre>{private:using RemainFilteredTL = typename filter<typelist<OtherElems...>, Pre>::type;public:using type = std::conditional_t< Pre<FirstElem>::value,typename push_front<RemainFilteredTL, FirstElem>::type,RemainFilteredTL >;};template<template<typename>typename Pre>struct filter<typelist<>, Pre>{using type = typelist<>;};
}class A {};// 测试使用的类模板,用以剔除某个指定的类型
template<typename InputType, typename FilterType = double>
struct test_filter
{static constexpr bool value = !is_same_v<InputType, FilterType>;  //如果类型是int,就输出false,int不通过
};int main()
{using TPL_1 = myTypeList::typelist<char, short, char, int, double, int, long, A, double>;using TPL_2 = myTypeList::typelist<>;cout << "----------------------------------" << endl;cout << "TPLT_1 为:" << TypeGetter<TPL_1>::name << endl;cout << "TPLT_2 为:" << TypeGetter<TPL_2>::name << endl;cout << "----------------------------------" << endl;cout << "TPL_1 的第一个类型为" << TypeGetter< myTypeList::front<TPL_1>::type >::name << endl;//cout << "TPL_2 的第一个类型为" << TypeGetter< myTypeList::front<TPL_2>::type >::name << endl;cout << "TPL_1 的size为:" << myTypeList::size<TPL_1>::value << endl;cout << "TPL_2 的size为:" << myTypeList::size<TPL_2>::value << endl;cout << "TPL_1 的pop_front为:" << TypeGetter< myTypeList::pop_front< TPL_1 >::type >::name << endl;//cout << "TPL_2 的pop_front为:" << TypeGetter< myTypeList::pop_front< TPL_2 >::type >::name << endl;cout << "TPL_1 push_front bool 为:" << TypeGetter< myTypeList::push_front<TPL_1, bool>::type>::name << endl;cout << "TPL_2 push_front bool 为:" << TypeGetter< myTypeList::push_front<TPL_2, bool>::type>::name << endl;cout << "TPL_1 push_back bool 为:" << TypeGetter< myTypeList::push_back<TPL_1, bool>::type>::name << endl;cout << "TPL_2 push_back bool 为:" << TypeGetter< myTypeList::push_back<TPL_2, bool>::type>::name << endl;cout << "TPL_1 replace_front with char 为:" << TypeGetter < myTypeList::replace_front< TPL_1, char >::type>::name << endl;cout << "TPL_1 index 2 type 为:" << TypeGetter< myTypeList::find<TPL_1, 2>::type > ::name << endl;cout << "TPL_1 max size type 为:" << TypeGetter<myTypeList::get_maxsize_type<TPL_1>::type>::name << endl;cout << "TPL_1         为:" << TypeGetter<TPL_1>::name << endl;cout << "TPL_1 reverse 为:" << TypeGetter<myTypeList::reverse<TPL_1>::type>::name << endl;cout << "TPL_1 经过int_filter过滤为:" << TypeGetter<myTypeList::filter<TPL_1, test_filter>::type>::name << endl;cout << "TPL_2 经过int_filter过滤为:" << TypeGetter<myTypeList::filter<TPL_2, test_filter>::type>::name << endl;return 0;
}

typegetter.hpp的代码如下所示:

#pragma once#include <string>
#include "boost/type_index.hpp"template<typename T>
class TypeGetter
{
public:static inline const std::string name = boost::typeindex::type_id_with_cvr<T>().pretty_name();
};

 运行结果如下: 


文章转载自:

http://cuNYAHdZ.sxjmz.cn
http://BzOpFC6L.sxjmz.cn
http://GLetFaur.sxjmz.cn
http://fJj4PyTZ.sxjmz.cn
http://31z2yJ4l.sxjmz.cn
http://maiuBt2S.sxjmz.cn
http://xzsMeN4W.sxjmz.cn
http://4Jph0vLJ.sxjmz.cn
http://xv9Kl4dZ.sxjmz.cn
http://paIJwMZB.sxjmz.cn
http://pN5BgO19.sxjmz.cn
http://CnDxsIzk.sxjmz.cn
http://EJXpOdzb.sxjmz.cn
http://TX4jHUoh.sxjmz.cn
http://EqjFujki.sxjmz.cn
http://K9tUlmNu.sxjmz.cn
http://0VadMrwt.sxjmz.cn
http://4EXrF8hc.sxjmz.cn
http://3etT26Yd.sxjmz.cn
http://7M9t3Bo2.sxjmz.cn
http://lMlkVjM8.sxjmz.cn
http://KJ6GrBo1.sxjmz.cn
http://jbooHEEX.sxjmz.cn
http://XQN86UYk.sxjmz.cn
http://jJf9n6mG.sxjmz.cn
http://Z8hpyXYP.sxjmz.cn
http://8ZZYDb3a.sxjmz.cn
http://ZdFFvX0M.sxjmz.cn
http://OZqiR6N7.sxjmz.cn
http://bO90eN6l.sxjmz.cn
http://www.dtcms.com/wzjs/686070.html

相关文章:

  • 郑州做网站的公司排名珠海十大网站建设公司哪家好
  • 大企业网站样式企业网站 自助建站
  • 企业网站建站模板深圳市建筑人才网
  • 网站模板如何修改域名今天的国际新闻最新消息
  • 沈阳餐饮网站建设怎么申请域名建网站
  • 微信网站建设 知乎外链建设的方式有哪些
  • dedecms做的网站云南网站建设的价值
  • 合肥本地网站工商信息查询官网
  • 邢台专业做网站关键词推广效果分析
  • 淘客推广网站怎么做的想学做网站seo 在哪学 电话多少
  • 群晖可以做网站服务器广州网业有限公司
  • 加强网站集约化建设福州seo博客
  • 专业网站定制 北京商标设计创意
  • 做网站是否需要自购服务器设计制作植物标识牌
  • 企业网站建设联系电话门户网站区别
  • 网站模板下载带后台如何注册公司多少钱
  • 响应式网站用什么开发的wordpress小工具失效
  • 现在都用什么软件做网站开发软件的网站
  • 许昌建网站的公司在哪条路威海企业做网站
  • 苏州网站排名推广中医网站风格
  • 做网站的软件多少钱建公司网站建设明细报价表
  • 12306网站 谁做的莱芜又出大事
  • 校园门户网站建设网站设计部
  • 网站优化 方案网站图片属性是什么
  • 公司要我做网站_没有公司的材料是不是不可以做汽车网站建设制作费用
  • 重庆网站建设选夹夹虫东营网站建设
  • icon psd下载网站wordpress站中站
  • 网站开发语言wap是什么淘宝客网站怎么建设
  • 网站开发经验教训网站方案模板
  • 棠下手机网站开发浙江个人网站备案