美文网首页
C++11 模板元编程 - 递归

C++11 模板元编程 - 递归

作者: MagicBowen | 来源:发表于2016-09-15 22:58 被阅读688次

函数式语言依赖模式匹配和递归完成类似命令式语言里分支选择和循环迭代的功能。模板元编程中可以完成模式匹配的两种方式上节已经介绍。本节介绍模板元编程中的递归。

前面在介绍编译期数值计算的整数阶乘的例子时,就已经展示了使用类模板进行递归计算的一般做法。这里再补充一点就是C++11支持了变长模板参数,而模板的变长参数也必须是要通过递归进行参数展开的。

如下,我们实现一个可以对任意个IntType进行求和的元函数Sum:

// "tlp/int/algo/Sum.h"

template<typename ...Numbers> struct Sum;

template<typename Number, typename ...LeftNumbers>
struct Sum<Number, LeftNumbers...>
{
    using Result = typename Add<Number, typename Sum<LeftNumbers...>::Result>::Result;
};

template<> struct Sum<>
{
    using Result = IntType<0>;
};

#define __sum(...)  typename Sum<__VA_ARGS__>::Result

在上面代码中,元函数Sum的原型是template<typename ...Numbers> struct Sum,它的参数是变长的typename ...Numbers。如果参数个数为0,则选择特化版本template<> struct Sum<>,这时结果为IntType<0>;否则递归展开参数,用当前参数和剩余参数的总和进行相加using Result = typename Add<Number, typename Sum<LeftNumbers...>::Result>::Result。注意声明变长参数时...在参数名前面,而对其使用时...在参数名后面。

该元函数的使用如下:

__sum();  // 返回 IntType<0>
__sum(__int(1), __int(2), __int(5)); // 返回 IntType<8>

不可变性

返回 C++11模板元编程 - 目录

相关文章

  • C++11 模板元编程 - 模板递归

    模板可以被递归调用,在模板递归的过程中,可以执行前面我们提到的两种编译期计算:数值计算和类型计算。 下面我们用模板...

  • C++11 模板元编程 - 递归

    函数式语言依赖模式匹配和递归完成类似命令式语言里分支选择和循环迭代的功能。模板元编程中可以完成模式匹配的两种方式上...

  • C++11 模板元编程 - 元编程

    从本节开始我们将模板元编程当做一门独立的函数式语言来讨论它的方方面面。 所谓元编程,就是指可以产生程序的程序。由于...

  • C++11 模板元编程 - 模板元编程的应用

    本节开始我们通过使用C++模板元编程去解决一些实际问题,来展示模板元编程针对现实问题的使用方法和设计技巧。本节中的...

  • C++11 模板元编程 - 元函数

    我们继续演进前面那个无聊的类型计算的例子,来得出元函数的定义。 前面我们实现了PointerOf,它对于传进的任意...

  • C++11 模板元编程 - 后记

    当1994年,Erwin Unruh在C++标准委员会上演示了通过C++模板在编译期计算素数的程序后,C++模板元...

  • C++11 模板元编程 - 前言

    熟悉C++的程序员都知道,C++是一门多范式编程语言,支持面向过程、面向对象、泛型编程以及函数式编程范式。然而提到...

  • C++11 模板元编程 - 目录

    前言 模板的基础知识模板的类型参数模板的默认参数模板的模板参数模板的特化模板的非类型参数模板的编译期计算数值计算类...

  • C++11 模板元编程 - 惰性

    C++对模板的具现化采用尽量惰性的原则。只有当你使用了模板的内部定义,编译器才会为模板生成对应的定义。 所以对于元...

  • C++11 模板元编程 - TypeList

    对函数式编程来说,list是其中最基础也是最重要的数据结构。通过list可以轻易地构造出tree,map等复杂数据...

网友评论

      本文标题:C++11 模板元编程 - 递归

      本文链接:https://www.haomeiwen.com/subject/izwbettx.html