#include <iostream>
using namespace std;
template<class FUNC>
class IndexFunctor
{
public:
typedef FUNC FUNC_T;
explicit IndexFunctor(const FUNC_T& func) : func(func), index(0) {}
private:
FUNC_T func;
int index;
public:
template<typename... Args>
auto operator ()(Args&&... args)
-> decltype(func(std::forward<Args>(args)..., index++)) //get return type
{
return func(std::forward<Args>(args)..., index++);
}
const FUNC_T& GetFunctor() const
{
return func;
}
int GetIndex() const
{
return index;
}
void SetIndex(int index)
{
this->index = index;
}
};
template<class FUNC>
IndexFunctor<FUNC> with_index(const FUNC& func)
{
return IndexFunctor<FUNC>(func);
}
int main()
{
auto f = with_index([](int a, int index){ return a * index; });
int a = f(5);
cout << a << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8Y2xhc3MgRlVOQz4KY2xhc3MgSW5kZXhGdW5jdG9yCnsKcHVibGljOgogICAgdHlwZWRlZiBGVU5DIEZVTkNfVDsKCglleHBsaWNpdCBJbmRleEZ1bmN0b3IoY29uc3QgRlVOQ19UJiBmdW5jKSA6IGZ1bmMoZnVuYyksIGluZGV4KDApIHt9Cgpwcml2YXRlOgogICAgRlVOQ19UIGZ1bmM7CglpbnQgaW5kZXg7CiAgICAKICAgIHB1YmxpYzoKCXRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+IAoJYXV0byBvcGVyYXRvciAoKShBcmdzJiYuLi4gYXJncykgCgktPiBkZWNsdHlwZShmdW5jKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLiwgaW5kZXgrKykpIC8vZ2V0IHJldHVybiB0eXBlCgl7CgkJcmV0dXJuIGZ1bmMoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uLCBpbmRleCsrKTsKCX0KCQoJY29uc3QgRlVOQ19UJiBHZXRGdW5jdG9yKCkgY29uc3QKCXsKCQlyZXR1cm4gZnVuYzsKCX0KCglpbnQgR2V0SW5kZXgoKSBjb25zdAoJewoJCXJldHVybiBpbmRleDsKCX0KCgl2b2lkIFNldEluZGV4KGludCBpbmRleCkKCXsKCQl0aGlzLT5pbmRleCA9IGluZGV4OwoJfQoKfTsKCnRlbXBsYXRlPGNsYXNzIEZVTkM+CkluZGV4RnVuY3RvcjxGVU5DPiB3aXRoX2luZGV4KGNvbnN0IEZVTkMmIGZ1bmMpCnsKCXJldHVybiBJbmRleEZ1bmN0b3I8RlVOQz4oZnVuYyk7Cn0KCmludCBtYWluKCkKewogICAgYXV0byBmID0gd2l0aF9pbmRleChbXShpbnQgYSwgaW50IGluZGV4KXsgcmV0dXJuIGEgKiBpbmRleDsgfSk7CiAgICBpbnQgYSA9IGYoNSk7CiAgICBjb3V0IDw8IGEgPDwgZW5kbDsKfQo=