美文网首页
模板元编程

模板元编程

作者: Realizability | 来源:发表于2016-04-23 21:46 被阅读0次

前一篇文章中介绍了使用lambda calculus构造自然数以及相关运算。在所有的图灵完备的语言中,我们都可以进行类似的行为。之前学习C++的时候,看过一些模板元编程的内容,所以决定用C++重写一遍,作为练习。

说明

模板元编程同样是图灵完备的,例如我们可以用如下的方式构建一个函数

template<typename x>
struct func{
    using ret=x;
 };

尖括号中的x即为输入,func<x>::ret就是我们的返回,不过这里都是类型。在后面我们可以看到非类型的输入和返回。
然而本人才疏学浅,并未找到像lambda演算中返回高阶函数的对应C++代码,所以只能换一种方式。
以下是我们定义0,1,2:

struct zero{
};
template<typename Nat>
struct succ{};  //后继
using one=succ<zero>;
using two=succ<one>;    //succ<succ<zero>>

接下来是加。

template<typename m,typename n>
struct plus;
template<typename Nat0,typename Nat2>
struct plus<succ<Nat0>,Nat2>{
    using ret=typename plus<Nat0,succ<Nat2>>::ret;
};
template<typename Nat>
struct plus<zero,Nat>{
    using ret=Nat;
};

是的,你没有看错其实就是模式匹配。当然这里我们用到的技术叫做模板偏特化SFINAE。等价Haskell代码如下:

plus :: Nat -> Nat -> Nat
plus zero n = n
plus (succ m) n = plus m (n+1)

emplate<typename m,typename n>
struct minus;
template<typename Nat1,typename Nat2>
struct minus<succ<Nat1>,succ<Nat2>>{
    using ret=typename minus<Nat1,Nat2>::ret;
};
template<typename Nat>
struct plus<Nat,zero>{
    using ret=Nat;
};

乘法

template<typename m,typename n>
struct multi;
template<typename Nat0,typename Nat2>
struct multi<succ<Nat0>,Nat2>{
    using ret=typename plus<typename multi<Nat0,Nat2>::ret,Nat2>::ret;
};
template<typename Nat>
struct multi<zero,Nat>{
    using ret=Nat;
};

乘方。

template<typename m,typename n>
struct exp;
template<typename Nat0,typename Nat2>
struct exp<Nat0,succ<Nat2>>{
    using ret=typename multi<typename exp<Nat0,Nat2>::ret,Nat2>::ret;
};
template<typename Nat>
struct exp<Nat,zero>{
    using ret=Nat;
};

更多

之前提到模板参数可以不是类型,例如最经典的阶乘

template<int x>
struct fact
{
    static const int ret=fact<x-1>::ret*(x-1);
};
template<0>
struct fact
{
    static const int ret =1;
};
int x=fib<5>;   //x=120

关于模板元编程还有许多内容,像构造ifwhile之类的在看了上面的例子之后想必也是手到擒来。等到下次我找到什么新的有意思的内容再来补充。

相关文章

  • C++11 模板元编程 - 类型操纵

    本文最开始介绍模板元编程的时候说过,模板元编程是写C++框架离不开的技术。本例将通过介绍模板元编程在dates框架...

  • 模板元编程

    什么是模板元 模板元编程是一种编译期计算的编程方法。如果你学过任意一门函数式的编程语言,那么你对模板元编程的理解一...

  • C++11 模板元编程 - 两阶段的C++语言

    前面我们介绍了C++模板元编程的基础知识。我们将模板元编程的计算对象统一到类型上,引入了元函数的概念。元函数是模板...

  • ★23.小窍门收集

    输出1-100 模板元编程 宏展开

  • 模板元编程

    在前一篇文章中介绍了使用lambda calculus构造自然数以及相关运算。在所有的图灵完备的语言中,我们都可以...

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

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

  • 模板元编程1

    在C++中,如果实现一个求和的功能,可能会这么写: 或者用上递归: 但是你有没有想过,在编译期完成所有的计算,这就...

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

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

  • 7.Netty框架-Netty编程模板(编程步骤)

    一、Netty编程模板 1、Netty编程步骤: 2、Netty编程代码模板:

  • 【游戏编程精粹】目录

    一 第一章 通用编程技术 1.0 神奇的数据驱动设计1.1 面向对象的编程与设计技术1.2 使用模板元编程的快速数...

网友评论

      本文标题:模板元编程

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