我怎样才能用C++编写一对函数呢

How can I compose a pair of functions in C++?

本文关键字:函数 C++      更新时间:2023-10-16

fg为两个单参数函数。在g之后的组成f被定义为函数x mapsto f(g(x))

说程序compose实现合成。例如,如果inc是一个在其自变量上加1并且square对其自变量进行平方的过程,((compose square inc) 6)评估为49。

解决方案很简单。它看起来很像它的数学模拟:

(define (compose f g)
  (lambda (x) (f (g x))))
Let's test:
(define (square x) (* x x))
(define (inc x) (+ x 1))
((compose square inc) 6)
Output:
 49

如何使用C++实现组合?有可能写出这样的参数并让函数自己实现吗?

是的,语法非常相似:

auto compose = [](auto f, auto g){
    return [f,g](auto x){return f(g(x));};
};
auto square = [](auto i){return i * i;};
auto inc = [](auto i){return i + 1;};
compose(square, inc)(6); // result is 49

在coliru 上直播

[](auto arg){}是一个通用lambda,您可以在lambdas上的cppreference页面上阅读更多关于它们(以及非通用lambdas)的信息。与具有指定参数类型([](int arg){})的lambda不同,它们的作用类似于具有模板化operator()的函子,因此允许在使用它们的参数类型的地方推导它们的参数。

一个非常简单的实现:

template <class F, class G, class T>
auto compose(F f, G g, T x)
{
  return f(g(x));
}

用法:

auto foo(int x)
{
  return x + 1;
}
auto bar(int x)
{
  return x * 2;
}
auto test()
{
  return compose(foo, bar, 24);
}

可以对其进行优化以移动参数。


如果您想要foobar的lambda,特别是:

auto compose = [](auto x) { return foo(bar(x)); }

然后:

cout << compose(24);