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 {
typedef
typename 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;

c8a5ac9836a1ca48762e1629560bc313.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值