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

## 1.IF实现

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

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

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

```template<int nums1, int nums2>
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>
static const auto RES = IF<cond, Add_<nums1, nums2>, Sub_<nums1, nums2>>::result::value;
};
```

```addSub<true, 10, 2>::RES
```

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

```

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

## 2.WHILE实现

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

```template<bool condition,
typename Body>
struct WhileLoop;
```

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

• 条件否定
```template<typename Body>
struct WhileLoop<false, Body> {
typedef
typename Body::res_type 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 SumLoop<result + n, n - 1>
next_type;
};
```

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

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

```cout << While<Sum<6>::type>::type::value << endl;
```

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

0 条评论

• ### cs231n之KNN、SVM

最近在学习cs231n，觉得有点困难，今天抽了一晚上时间来写这篇文章，作为总结。下面一起来看任务一的题目，由于篇幅长，故分成两部分，下节重点softmax!

• ### SVM梯度求导及实现

昨晚看了一部电影，叫做我是马布里，非常正能量，推荐给各位，看完这部电影的总结话是：

• ### C++模板坑，一起来issue

C++开发中通常将类定义放在C ++头文件(.h)中，并将实现放在C ++源文件(.cpp)中。然后，将源文件作为项目的一部分，这意味着将其单独编译。但是，当我...

• ### 浙大版《C语言程序设计（第3版）》题目集 练习7-10 查找指定字符

输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串（不超过80个字符）。

• ### Hive应用：explode和lateral view

这个函数大多数人都接触过，将一行数据转换成列数据，可以用于array和map类型的数据。

• ### FZU 1894 志愿者选拔

Accept: 2308 Submit: 7003 Time Limit: 1500 mSec Memory Limit : 32768 KB

• ### HBase运维 | HBase宕机恢复案例一则

从上图可以看到zk中/Hbase/replication/rs的节点信息无法获取，然后我们立马去检查zk日志发现zk已经全部断联而且已经瘫痪，截图如下：

• ### 毕业一年多被裁，没有计算机文凭，我在两个月内搞定4份Offer，且收入翻倍

遭上家公司辞退，花两个月拿到四个 offer，还实现收入翻倍，这很难吗？现任 Airbnb 软件工程师的 Emma Ding 介绍了她的经验，说不定可以帮助到近...