如何在C ++中编写一对函数?

时间:2016-07-20 21:48:41

标签: c++

fg成为两个单参数函数。 f之后的合成g被定义为函数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 ++实现组合?是否可以像这样编写参数并让函数实现自己?

2 个答案:

答案 0 :(得分:5)

是的,语法非常相似:

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

Live on coliru

[](auto arg){}泛型lambda ,你可以在cppreference's page on lambdas上阅读更多关于它们(以及非通用lambda)的内容。与具有指定参数类型([](int arg){})的lambda不同,它们的行为类似于带有模板化operator()的仿函数,因此允许在其使用的位置推导出它们的参数类型。

答案 1 :(得分:0)

一个非常简单的实现:

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);