跟我学c++高级篇——模板元编程之十序列和函数柯里化

一、序列

序列其实就是类型容器,在STL中有数据的容器,当然,在元编程中就会有数据类型的容器。说到这里,会不会有点熟悉,对,它和Typelist基本上就是一回事。只不过在《c++模板元编程》和《Modern C++ Design》中阐述的角度有所不同。

template <class... Args>
struct typelist {};
template <class T, class N>
struct type_pushback;

template <class T, class... Args>
struct type_pushback<typelist<Args...>, T> {
    using type = typelist<Args..., T>;
};

二、函数柯里化

函数柯里化的定义是:
“在计算机科学中,柯里化(英語:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。”
相应的,还有一个反柯里化函数(Uncurrying)。
currying的例子:

function Sum(a,b,c) {
    console.log(a+b+c)
}

function curry(fn) {
}

let FnSum = curry(sum);
let Fn1 = FnSum(10);
let Fn2 = Fn1(12);
Fn2(6)   

Uncurrying的例子:

var foo = function(a) {
  return function(b) {
    return a * a + b * b;
  }
}
//call
(foo(3))(4),或直接foo(3)(4)

在c++模板元编程中也可以模拟这种方式:

template<typename T>
using CT =  std::conditional<true, T, int>::type ;

如果不使用std::conditional,而是自定义实现一个类,可以更好的体现柯里化,大家可以自己试一下。原则就是通过元编程中的模板形参来模拟函数的参数。

三、总结

本篇其实就是把一些具体的用法和称谓统一说明一下。其实有些东西可能用到了但是不明白是什么。而有些东西明白是什么没有用到过。这里就把这两个沟通一下,这就是上学时老师常说的融会贯通吧。

猜你喜欢

转载自blog.csdn.net/fpcc/article/details/129416219