现代C++之模板元编程(今天写个If与While)

0.导语

今天就放轻松,有可能代码写的看的很晦涩,自己多敲几遍即可,下面来进入正文,如何使用模板元编程实现IF与WHILE。

1.IF实现

我们想要的目标如下:

// 加减template<bool cond, int nums1, int nums2>struct addSub {static const auto RES = IF, Sub_>::result::value;};// 调用cout << addSub<true, 10, 2>::RES << endl;

当IF条件成立就将两数相加,否则两数相减,就是IF...Then...Else...的逻辑。

首先声明一个空的结构体:

template<bool cond,typename Then,typename Else>struct IF;

我们想一下,当IF中的cond条件成立,是不是输出结果就是Then,否则结果就是Else,因此我们只需要获取这两个即可呗。

因此,引出两个偏特化版本:

  • 条件成立
template<typename Then,typename Else>struct IF {typedef Then result;};
  • 条件失败
template<typename Then,typename Else>struct IF {typedef Else result;};

这个搞定了,现在就简单了,编写Then是什么,Else是什么不就得了,因此又得到:

template<int nums1, int nums2>struct Add_ {static const int value = nums1 + nums2;};

template<int nums1, int nums2>struct Sub_ {static const int value = nums1 - nums2;};

最后我们一封装,就是下面这个:

template<bool cond, int nums1, int nums2>struct addSub {static const auto RES = IF, Sub_>::result::value;};

然后一调用:

addSub<true, 10, 2>::RES

我们的模板实现IF就完成了,哈哈~

除此之外,也可以编写其他需求:

例如:判断输入的数的奇偶性。

// 判断奇数与偶数template<int N>struct isEven {static const auto RES = IF1 == 0, true_type, false_type>::result::value;};

调用:

cout << isEven<10>::RES << endl;

2.WHILE实现

有了IF,WHILE就水到渠成。

原理是一毛一样!

例如:求0~n的和。

template<int n>struct Sum {typedef SumLoop<0, n> type;};// 调用cout << While6>::type>::type::value << endl;

因此编写While就成了关键。里面的Sum是判断的条件。

故模仿IF编写,我们先声明一个WhileLoop:

template<bool condition,typename Body>struct WhileLoop;

紧接着,两个偏特化:

  • 条件成立
template<typename Body>struct WhileLoop {typedef typename WhileLoop<            Body::cond_value,typename Body::next_type>::type            type;};

此处需要注意:针对while来说,条件成立后,是不断的循环,直到条件不满足,因此这里的true取Body的cond_value成员,而body取Body的next_type,在之后编写循环条件的时候,需要包含这两个。

  • 条件否定
template<typename Body>struct WhileLoop {typedeftypename Body::res_type type;};

直接把Body的res_type进行返回,便是最后的结果。

最后,编写循环所需的内容:

template<int result, int n>struct SumLoop {

// 循环的条件static const bool cond_value =            n != 0;

// 循环后的结果static const int res_value =            result;

// 循环时的状态typedef my::integral_constant<int, res_value>            res_type;

// 循环执行一次时的状态typedef SumLoop1>            next_type;};

这里integral_constant可以是自己写的,也可以是std里面的。

namespace my {template<class T, T v>struct integral_constant {static const T value = v;typedef T value_type;typedef integral_constant type;    };}

integral_constant就是对模板参数进行了重新命名,非常简单。

然后,调用:

cout << While6>::type>::type::value << endl;

在C++14之后,有了下面语法,因此上述调用可以被简化:

template<int n>using Sum_t = SumLoop<0, n>;// 调用cout << While_t6>>::type::value << endl;

xpath里面if判断一个值不为空_现代C++之模板元编程(今天写个If与While)相关推荐

  1. 判断表达式值是否为空_如何在 Python 中判断列表是否为空

    在判断列表是否为空时,你更喜欢哪种方式?决定因素是什么? 在 Python 中有很多检查列表是否是空的方式,在讨论解决方案前,先说一下不同方法涉及到的不同因素. 我们可以把判断表达式可以分为两个阵营: ...

  2. 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...

    本文使用 Zhihu On VSCode 创作并发布 [TOC] 前言 寒假时沉迷C++模板元编程,写了个简单的Scheme元循环求值器.可以用类似Scheme的语法写出这样的C++模板代码: _&l ...

  3. python之判断一个值是不是可以被调用

    判断一个值是不是可以被调用---callable方法 要点,传值时只传入名字,后面不加括号 def func(arg):"""判断arg是否可以被调用,如果可以则执行,并 ...

  4. JavaScript如何判断一个值是不是数字?

    JavaScript如何判断一个值是不是数字? 第一种方法:isNaN() 使用js自带全局函数isNaN(), isNaN()返回一个Boolean值,如下 : var c="hello& ...

  5. python判断一个值是否为Nan,NULL

    python判断一个值是否为Nan,NULL 在实际的实验中,我们经常会遇到输出为Nan或者NULL的情况,那么我们该如何去判断它,然后用if语句将其规避勒 方案一如下: import numpy a ...

  6. shell中如何判断一个变量是否为空

    shell中如何判断一个变量是否为空 shell编程中,对参数的错误检查项中,包含了变量是否赋值(即一个变量是否为空),判断变量为空方法如下: 1.变量通过" "引号引起来 #!/ ...

  7. 在shell中如何判断一个变量是否为空

    在shell中如何判断一个变量是否为空 判断一个脚本中的变量是否为空,我写了一个这样的shell脚本: #!/bin/sh #filename: test.sh para1= if [ ! -n $p ...

  8. linux 脚本 变量为空,Shell判断一个变量是否为空

    判断一个变量是否为空 . 1. 变量通过" "引号引起来 如下所示:,可以得到结果为 IS NULL. #!/bin/sh para1= if [ ! -n "$para ...

  9. mybatis如何判断一个字段不为空,或空字符串

    mybatis如何判断一个字段不为空,或空字符串 <select id="countStudentNumber" resultType="java.lang.Int ...

最新文章

  1. python解释器是什么-python解释器都有什么
  2. 架构漫谈(1):什么是架构
  3. ObjectDataSourc用法之三(排序)
  4. 与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信
  5. 写出python字符串三种常用的函数或方法_python中几种常用字符串函数
  6. su如何变成实体_紫天学习星球教学:如何在SU里把JPG图片变成三维模型
  7. java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String
  8. FFmpeg在Linux下安装编译过程
  9. 深入理解Linux中内存管理
  10. 阿里飞天云平台架构简介
  11. 图文解析如何配置网络交换机配置
  12. javaweb—web环境搭建
  13. 保留扇区读写java,FAT32文件操作系统
  14. 智慧公寓管理系统解决方案
  15. 滑环在管线防滑安全固定器中的作用是什么
  16. 美食大战老鼠html,美食大战老鼠卤料花园过法详解
  17. R——R的一些边边角角
  18. Windows Media Player进度条无法自动播放的解决方法
  19. 联想笔记本无法切换独显、强行切换提示核芯显卡不兼容
  20. Blender 使用Bone Layers插件管理骨骼层

热门文章

  1. logback配置文件详解
  2. c语言序列化后只有四位小数,《C编程.高级C》4.序列化
  3. mysql8.0新建用户登录_Mysql8.0 创建远程登陆账户
  4. 外星人颜色python练习_在知乎上学Python爬虫
  5. “Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法...
  6. IntelliJ IDEA 14 创建maven项目二
  7. 替换 centOS6.5 默认安装的旧版 firefox ,安装最新版 firefox 全过程
  8. VMware中的三种网络模式-----Host-only模式
  9. chrome和火狐获取资源
  10. Android 编码规范:(七)避免使用终结方法