如何使用C++模板变参实现Loki中的Length和TypeAt
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章将为大家详细讲解有关如何使用C++模板变参实现Loki中的Length和TypeAt,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一,原Loki中的Leng
千家信息网最后更新 2025年01月20日如何使用C++模板变参实现Loki中的Length和TypeAt
这篇文章将为大家详细讲解有关如何使用C++模板变参实现Loki中的Length和TypeAt,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一,原Loki中的Length和TypeAt模拟实现如下
1,模板文件
#ifndef __SZYU_LOKI__#define __SZYU_LOKI__#include#include template class TypeList{public: typedef T Head; typedef U Tail;};class NullType;#define TYPELIST_1(type1) TypeList #define TYPELIST_2(type1, type2) TypeList #define TYPELIST_3(type1, type2, type3) TypeList /********************************************* Loki Length***********************************************/template class Length;template class Length >{public: enum { value = 1 + Length::value };};template <>class Length {public: enum { value = 0 };};/********************************************* Loki TypeAt***********************************************/template class TypeAt;template class TypeAt , index>{public: typedef typename TypeAt::Result Result;};template class TypeAt , 0>{public: typedef T Result;};#endif
2,测试用例
/********************************** ** Author : szyu** Date : 2017.1.7***************************************/#include "loki.h"voidtest1(){ std::cout << "Length..." << Length ::value << std::endl; std::cout << "Length ..." << Length ::value << std::endl; std::cout << "Length ..." << Length ::value << std::endl; std::cout << "************************************" << std::endl; std::vector IntVector; std::cout << typeid(TypeAt ), 0>::Result).name() << std::endl; std::cout << typeid(TypeAt ), 1>::Result).name() << std::endl; std::cout << typeid(TypeAt ), 2>::Result).name() << std::endl; TypeAt ), 0>::Result var1; var1 = 10.10; TypeAt ), 1>::Result var2; var2 = "abc"; TypeAt ), 2>::Result var3; var3 = IntVector;}intmain( int argc, char *argv[] ){ test1(); return 0;}
3,执行结果如下:
二,使用C++11模板变参特性改进Length和TypeAt
在不使用模板变参会出现繁杂的TypeList嵌套问题,虽然使用宏定义能增加代码可读性,但是也因此需要定义大量的宏来支持。当出现几百个参数(极端)情况下,那需要定义几百个宏。显然比较麻烦。C++11提供了模板的变参的支持,故变参实现Length和TypeAt如下:
1,头文件
/********************************** ** Author : szyu** Date : 2017.1.6************************************/#ifndef __SZYU_LOKI__#define __SZYU_LOKI__#include#include /************************************* Loki length****************************************/template class Length{public: enum { value = 1 + Length ::value };};template class Length {public: enum { value = 1 };};/************************************* Loki TypeAt****************************************/template class TypeAt{public: typedef typename TypeAt ::Result Result;};template class TypeAt<1, T, Args...>{public: typedef T Result;};#endif
2,测试用例
/********************************** ** Author : szyu** Date : 2017.1.6************************************/#include "TypeList.h"voidtest1(){ std::cout << "Length..." << Length ::value << std::endl; std::cout << "Length ..." << Length ::value << std::endl; std::cout << "Length ..." << Length ::value << std::endl; std::cout << "********************************" << std::endl; std::vector IntVector; std::cout << typeid(TypeAt<1, int, std::string, std::vector >::Result).name() << std::endl; std::cout << typeid(TypeAt<2, int, std::string, std::vector >::Result).name() << std::endl; std::cout << typeid(TypeAt<3, int, std::string, std::vector >::Result).name() << std::endl; TypeAt<1, int, std::string, std::vector >::Result var1; var1 = 10; TypeAt<2, int, std::string, std::vector >::Result var2; var2 = "ssss"; TypeAt<3, int, std::string, std::vector >::Result var3; var3 = IntVector;}intmain( int argc, char *argv[] ){ test1(); return 0;}
3,执行结果
TypeAt的实现中,由于变参要位于最后一个参数,故把位置参数移到了模板第一个参数。
关于"如何使用C++模板变参实现Loki中的Length和TypeAt"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
模板
参数
篇文章
C++
文件
更多
结果
支持
测试
不错
实用
繁杂
代码
内容
可读性
情况
把位
文章
极端
特性
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络技术产生背景
网络安全基础教程视屏
古籍数据库如何编写
查看代理服务器白名单
软件开发过程三个里程碑
怎么使用代理服务器
软件开发案例分析大纲
网络安全费用占项目额的比例
java 调度服务器
管家婆服务器设置端口转发
如何查看学校数据库
怎么查询全球癌症数据库
网络安全警示教育会议材料
网络安全防护基础不完善
挂q的服务器
公安网网络安全等级
wcs仓库控制系统服务器
网络安全生产月活动方案
查看数据库中所有表的语句
网络安全教育宣传片300
云服务器直接买linux系统吗
网络安全密码在哪里找
从事软件开发的典型企业
宁海一站式软件开发公司
如何查看学校数据库
电梯 刷卡 中心数据库
进入游戏服务器看不到
河北ios软件开发诚信企业
达芬奇调色数据库丢失
网络usb服务器怎么使用