最近在学C++ 11 , 发现很多有意思的东西,感觉C++在变好,但是。。。
书接上文,在C语言中,如果想一个函数返回一个新的函数其实是不行的,也就是说C语言是不具备函数式编程的能力的,C++ 可以,有两种实现方式,一种是使用Lambda 表达式,另一种是使用标准库的bind 函数,bind 的实现原理得益于 C++11 实现了不定长参数的模板定义。
Lambda 表达式的一种写法:
#include <iostream>
template<typename T>
auto addN(T n) {
return [n](decltype(n) m) {
return n + m;
};
}
int main() {
auto f = addN(5);
std::cout<< f(10) << std::endl;
return 0;
}
std::bind 的实现如下:
#include <iostream>
#include <functional>
//template<typename T>
//auto add(T n, T m) {
// return n + m;
//}
auto add(int n, int m) {
std::cout << "n = " << n << std::endl;
std::cout << "m = " << m << std::endl;
return n + m;
}
int main() {
auto f = std::bind(add, 5, std::placeholders::_1);
std::cout<< f(10) << std::endl;
std::cout<< f(200) << std::endl;
return 0;
}
代码中我特意写了一段模板形式的 add 函数,如果你去编译,其实是过不去的,简单的说,对于模板函数由于没有实体,所以 bind 函数无法操作,解决的方案就是使用函数对象替代它,代码如下:
#include <iostream>
#include <functional>
template<typename T>
class add {
public:
auto operator()(T n, T m) {
std::cout << "n = " << n << std::endl;
std::cout << "m = " << m << std::endl;
return n + m;
}
};
int main() {
auto f = std::bind(add<int>(), 5, std::placeholders::_1);
std::cout<< f(10) << std::endl;
std::cout<< f(200) << std::endl;
return 0;
}
在说一点, std::placeholders::_1 就是一个参数占位符,怎么实现的我不太了解,后期有时间再弄,但是这里的作用就是告诉函数f ,输入的第一个参数传递给原来的函数的第二个位置!!!
这里还是有些问题,明天再说!