美文网首页
C++11 模板元编程 - 柯理函数

C++11 模板元编程 - 柯理函数

作者: MagicBowen | 来源:发表于2016-09-15 09:21 被阅读1047次

现在,我们想实现一个元函数,可以返回char类型指定层数的指针类型。

template<int N>
struct CharPointer
{
    using Result = typename Times<N, char, PointerOf>::Result;
};

如上,我们定义了元函数CharPointer,它是一个int型单参元函数。它的实现调用了Times,将其第二和第三个参数分别固定为char和PointerOf。

借助于继承的特性,上面的代码可以简化为:

template<int N>
struct CharPointer :Times<N, char, PointerOf>
{
};

这种定义元函数的方式叫做元函数转发

如果借助using关键字,可以实现得更加简单:

template<int N> using CharPointer = Times<N, char, PointerOf>;

这里我们直接对Times绑定第二和第三个参数后为其起了别名CharPointer。

在函数式编程里面,有个概念叫做函数柯里化(currying),是指一个函数接收部分参数后,并不立即求值,而是继续返回另一个函数。

如下Haskell代码定义了一个三数相乘的函数multiThree,它接收三个Int型参数返回它们的乘积:

multiThree :: Int -> Int -> Int -> Int
multiThree x y z = x * y * z

当我们将multiThree其中一个参数固定后,它就变成了一个二参函数。

ghci > let multiTwoWithNine = multiThree 9
ghci > multiTwoWithNine 2 3

我们使用using关键字实现元函数转发,可以达到类似函数柯里化的效果。柯里化可以帮助更容易地复用函数,实现函数之间更低成本且更灵活的组合。

函数柯里化在函数式编程语言里的意义非常重要,和C++模板元编程里面的还是有区别的。例如在Haskell中,可以不用为柯里化函数定义别名,就直接将其作为另一个函数的参数传递,而在C++模板元编程里目前还做不到。

现在借助柯里化,我们重新实现Pointer2Of如下:

template<typename T> using Pointer2Of = Times<2, T, PointerOf>;

可以看到,所谓的Pointer2Of,其实就是把Times的第一个和第三个参数固定后,得到的单参柯里化函数。


一切都是类型

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

相关文章

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

    现在,我们想实现一个元函数,可以返回char类型指定层数的指针类型。 如上,我们定义了元函数CharPointer...

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

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

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

    前面介绍了元函数转发的概念,也就是通过已有的元函数组合,来定义新的元函数。 如下我们实现一个元函数TypeSize...

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

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

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

    接着上面的例子,此刻我们想要定义指向指针的指针的指针的指针类型,怎么办?或者说我们想要一种能够任意指定指针层数的元...

  • 模板元编程

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

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

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

  • C++11 模板元编程 - 基础类型和元函数

    前面已经介绍过了,TLP库中通过IntType和BoolType对int和bool值进行封装,并且提供了对应的计算...

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

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

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

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

网友评论

      本文标题:C++11 模板元编程 - 柯理函数

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