xpath里面if判断一个值不为空_现代C++之模板元编程(今天写个If与While)
现代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)相关推荐
- 判断表达式值是否为空_如何在 Python 中判断列表是否为空
在判断列表是否为空时,你更喜欢哪种方式?决定因素是什么? 在 Python 中有很多检查列表是否是空的方式,在讨论解决方案前,先说一下不同方法涉及到的不同因素. 我们可以把判断表达式可以分为两个阵营: ...
- 编程实现算术表达式求值_用魔法打败魔法:C++模板元编程实现的scheme元循环求值器...
本文使用 Zhihu On VSCode 创作并发布 [TOC] 前言 寒假时沉迷C++模板元编程,写了个简单的Scheme元循环求值器.可以用类似Scheme的语法写出这样的C++模板代码: _&l ...
- python之判断一个值是不是可以被调用
判断一个值是不是可以被调用---callable方法 要点,传值时只传入名字,后面不加括号 def func(arg):"""判断arg是否可以被调用,如果可以则执行,并 ...
- JavaScript如何判断一个值是不是数字?
JavaScript如何判断一个值是不是数字? 第一种方法:isNaN() 使用js自带全局函数isNaN(), isNaN()返回一个Boolean值,如下 : var c="hello& ...
- python判断一个值是否为Nan,NULL
python判断一个值是否为Nan,NULL 在实际的实验中,我们经常会遇到输出为Nan或者NULL的情况,那么我们该如何去判断它,然后用if语句将其规避勒 方案一如下: import numpy a ...
- shell中如何判断一个变量是否为空
shell中如何判断一个变量是否为空 shell编程中,对参数的错误检查项中,包含了变量是否赋值(即一个变量是否为空),判断变量为空方法如下: 1.变量通过" "引号引起来 #!/ ...
- 在shell中如何判断一个变量是否为空
在shell中如何判断一个变量是否为空 判断一个脚本中的变量是否为空,我写了一个这样的shell脚本: #!/bin/sh #filename: test.sh para1= if [ ! -n $p ...
- linux 脚本 变量为空,Shell判断一个变量是否为空
判断一个变量是否为空 . 1. 变量通过" "引号引起来 如下所示:,可以得到结果为 IS NULL. #!/bin/sh para1= if [ ! -n "$para ...
- mybatis如何判断一个字段不为空,或空字符串
mybatis如何判断一个字段不为空,或空字符串 <select id="countStudentNumber" resultType="java.lang.Int ...
最新文章
- python解释器是什么-python解释器都有什么
- 架构漫谈(1):什么是架构
- ObjectDataSourc用法之三(排序)
- 与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信
- 写出python字符串三种常用的函数或方法_python中几种常用字符串函数
- su如何变成实体_紫天学习星球教学:如何在SU里把JPG图片变成三维模型
- java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String
- FFmpeg在Linux下安装编译过程
- 深入理解Linux中内存管理
- 阿里飞天云平台架构简介
- 图文解析如何配置网络交换机配置
- javaweb—web环境搭建
- 保留扇区读写java,FAT32文件操作系统
- 智慧公寓管理系统解决方案
- 滑环在管线防滑安全固定器中的作用是什么
- 美食大战老鼠html,美食大战老鼠卤料花园过法详解
- R——R的一些边边角角
- Windows Media Player进度条无法自动播放的解决方法
- 联想笔记本无法切换独显、强行切换提示核芯显卡不兼容
- Blender 使用Bone Layers插件管理骨骼层
热门文章
- logback配置文件详解
- c语言序列化后只有四位小数,《C编程.高级C》4.序列化
- mysql8.0新建用户登录_Mysql8.0 创建远程登陆账户
- 外星人颜色python练习_在知乎上学Python爬虫
- “Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法...
- IntelliJ IDEA 14 创建maven项目二
- 替换 centOS6.5 默认安装的旧版 firefox ,安装最新版 firefox 全过程
- VMware中的三种网络模式-----Host-only模式
- chrome和火狐获取资源
- Android 编码规范:(七)避免使用终结方法