bindを実装してみる

意外とわかりやすい…と思うんだけど。

#include <iostream>

using namespace std;

template <class R, class A>
class Function {
  R (*f_)(A);
  A x_;

public:
  Function(R (*f)(A), A x) : f_(f), x_(x) {}
  R operator() () { return f_(x_); }
};

template <class R, class A>
Function<R, A> bind(R (*f)(A), A x) {
  return Function<R, A>(f, x);
}

int count(int *n) {
  return ++(*n);
}

int main() {
  int n = 0;
  Function <int, int *> f = bind(count, &n);

  cout << f() << endl; // => 1
  cout << f() << endl; // => 2
  cout << f() << endl; // => 3
}