#include <iostream>
#include <functional>
template <typename OBJ>
int foo(int n, OBJ o)
{
int x = 0;
for (int i = 0; i < n; ++i) {
x += o[i];
}
return x;
}
template <typename> struct Functor;
template <typename R> struct Functor<R(int)>
{
using ftype = std::function<R(int)>;
Functor(ftype f) : f_(f) {}
R operator[](int i) const { return f_(i); }
ftype f_;
};
int main()
{
Functor<int(int)> f = {[](int i) -> int {return i*i;}};
std::cout << foo(10, f) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBPQko+CmludCBmb28oaW50IG4sIE9CSiBvKQp7CiAgaW50IHggPSAwOwogIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICB4ICs9IG9baV07CiAgfQogIHJldHVybiB4Owp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWU+IHN0cnVjdCBGdW5jdG9yOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFI+IHN0cnVjdCBGdW5jdG9yPFIoaW50KT4KewogICB1c2luZyBmdHlwZSA9IHN0ZDo6ZnVuY3Rpb248UihpbnQpPjsKICAgRnVuY3RvcihmdHlwZSBmKSA6IGZfKGYpIHt9CgogICBSIG9wZXJhdG9yW10oaW50IGkpIGNvbnN0IHsgcmV0dXJuIGZfKGkpOyB9CgogICBmdHlwZSBmXzsKfTsKCmludCBtYWluKCkKewogICBGdW5jdG9yPGludChpbnQpPiBmID0ge1tdKGludCBpKSAtPiBpbnQge3JldHVybiBpKmk7fX07CiAgIHN0ZDo6Y291dCA8PCBmb28oMTAsIGYpIDw8IHN0ZDo6ZW5kbDsKfQo=