一、序列
序列其实就是类型容器,在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,而是自定义实现一个类,可以更好的体现柯里化,大家可以自己试一下。原则就是通过元编程中的模板形参来模拟函数的参数。
三、总结
本篇其实就是把一些具体的用法和称谓统一说明一下。其实有些东西可能用到了但是不明白是什么。而有些东西明白是什么没有用到过。这里就把这两个沟通一下,这就是上学时老师常说的融会贯通吧。