accumulator generator in C++0x

accumulator generator というものがあります。暇つぶしに C++0x で書いてみました。

#include <memory>
#include <functional>

template <typename Num>
auto accgen(Num n) -> std::function<auto (Num) -> Num> {
  auto np = std::make_shared<Num>(n);
  return [np](Num i) -> Num {
    return (*np) += i;
  };
}

ラムダは所有のセマンティクスを持っていないので、shared_ptr を利用します。
リンク先C++ の実装に比べると、accumulator が多相的でないという違いがありますが、Haskell とかもそうじゃないし、いいかなあ…まあ随分とマシになっているんじゃあないでしょうか。

寧ろ Haskell で多相的な accumulator を返すことができなくてモガモガするのが暇つぶしにしまった感が…結局書けなかったし。