专栏首页光城(guangcity)现代C++之模板元编程(今天写个If与While)

现代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<cond, Add_<nums1, nums2>, Sub_<nums1, nums2>>::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<true, Then, Else> {
    typedef Then result;
};
  • 条件失败
template<typename Then,
        typename Else>
struct IF<false, Then, Else> {
    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<cond, Add_<nums1, nums2>, Sub_<nums1, nums2>>::result::value;
};

然后一调用:

addSub<true, 10, 2>::RES

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

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

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

// 判断奇数与偶数
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实现

有了IF,WHILE就水到渠成。

原理是一毛一样!

例如:求0~n的和。

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

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

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

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;
};

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

  • 条件否定
template<typename Body>
struct WhileLoop<false, Body> {
    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 SumLoop<result + n, n - 1>
            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<T, v> type;
    };
}

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

然后,调用:

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

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

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

本文分享自微信公众号 - 光城(guangcity),作者:lightcity

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • cs231n之KNN、SVM

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

    公众号guangcity
  • SVM梯度求导及实现

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

    公众号guangcity
  • C++模板坑,一起来issue

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

    公众号guangcity
  • 浙大版《C语言程序设计(第3版)》题目集 练习7-10 查找指定字符

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

    C you again 的博客
  • Hive应用:explode和lateral view

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

    云飞扬
  • 开发这样一个复杂的表单你需要用多久

    工具人
  • FZU 1894 志愿者选拔

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

    风骨散人Chiam
  • HBase运维 | HBase宕机恢复案例一则

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

    大数据技术架构
  • Android项目实战(二十六):蓝牙连接硬件设备开发规范流程

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

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

    机器之心

扫码关注云+社区

领取腾讯云代金券