十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章将为大家详细讲解有关如何使用C++模板变参实现Loki中的Length和TypeAt,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
创新互联专注于企业成都全网营销推广、网站重做改版、海州网站定制设计、自适应品牌网站建设、H5网站设计、商城网站建设、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为海州等各大城市提供网站开发制作服务。
一,原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"
void
test1()
{
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;
}
int
main( 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"
void
test1()
{
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;
}
int
main( int argc, char *argv[] )
{
test1();
return 0;
} 3,执行结果

TypeAt的实现中,由于变参要位于最后一个参数,故把位置参数移到了模板第一个参数。
关于“如何使用C++模板变参实现Loki中的Length和TypeAt”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。