lisp语言中有高阶函数的概念,即函数可以作为函数的参数,也可以作为函数的返回值。例如: (define (f n) (lambda (x) (+ x n))) 定义了一个函数f,该函数的返回值是另一个函数,假定称为g即 (lambda (x) (+ x n) 此函数功能是参数为x,返回值为x + n。 于是 ((f 7) 9) 如下执行 (f 7)以参数7调用f, f的返回值是g,n的值为7 ((f 7) 9)等价于 (g 9),即以参数9调用g。 因 n = 7, x = 9 ,因此(g 9)返回值为16 编写一个C++的通用函数模板f,使之能完成类似于lisp函数f的功能。 对于下面的程序,输出结果是 16 world hello! world!
时间: 2023-06-14 15:04:45 浏览: 149
以下是实现该功能的C++函数模板:
```cpp
template <typename F, typename T>
auto f(F func, T arg) {
return [func, arg](auto... args) {
return func(args..., arg);
};
}
```
其中,模板参数F表示函数类型,模板参数T表示参数类型。函数模板f的返回值是一个lambda表达式,该表达式接受任意个数的参数,并将最后一个参数作为参数传递给函数func,然后返回函数func的返回值。
使用该函数模板实现上述Lisp函数f的功能,可以这样写:
```cpp
#include <iostream>
auto f(int n) {
return [n](int x) {
return x + n;
};
}
int main() {
auto g = f(7);
std::cout << g(9) << " "; // 输出 16
auto h = f(5);
std::cout << h(3) << " "; // 输出 8
auto i = f(10);
std::cout << i(0) << " "; // 输出 10
std::cout << i(100) << " "; // 输出 110
std::cout << "world hello! world!" << std::endl; // 输出 world hello! world!
return 0;
}
```
在上面的代码中,首先通过调用函数模板f来创建了三个函数对象g、h和i,这三个函数对象分别具有不同的n值。然后对这三个函数对象分别调用,输出相应的结果,并输出最后一行的字符串。
阅读全文