#include <iostream>
using namespace std;
template< typename OP, typename State, typename ...T>
struct fold
{
typedef State type;
};
template<typename OP, typename State, typename Head, typename... Tail>
struct fold< OP, State, Head, Tail...>
{
typedef typename fold<OP, typename OP::template apply<State,Head>::type, Tail...>::type type;
};
template<typename T>
void foo()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
struct op
{
template<typename X, typename Y>
struct apply
{
typedef std::pair<X,Y> type;
};
};
int main() {
typedef fold< op, int, long, short, double, float>::type type;
foo<type>();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0ZW1wbGF0ZTwgdHlwZW5hbWUgT1AsIHR5cGVuYW1lIFN0YXRlLCB0eXBlbmFtZSAuLi5UPgpzdHJ1Y3QgZm9sZAp7CiAgICB0eXBlZGVmIFN0YXRlIHR5cGU7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBPUCwgdHlwZW5hbWUgU3RhdGUsIHR5cGVuYW1lIEhlYWQsIHR5cGVuYW1lLi4uIFRhaWw+CnN0cnVjdCBmb2xkPCBPUCwgU3RhdGUsIEhlYWQsIFRhaWwuLi4+CnsKICAgdHlwZWRlZiB0eXBlbmFtZSBmb2xkPE9QLCB0eXBlbmFtZSBPUDo6dGVtcGxhdGUgYXBwbHk8U3RhdGUsSGVhZD46OnR5cGUsIFRhaWwuLi4+Ojp0eXBlIHR5cGU7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIGZvbygpCnsKCXN0ZDo6Y291dCA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8IHN0ZDo6ZW5kbDsKfQoKc3RydWN0IG9wCnsKCXRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFk+CglzdHJ1Y3QgYXBwbHkKCXsKCQl0eXBlZGVmIHN0ZDo6cGFpcjxYLFk+IHR5cGU7Cgl9Owp9OwoKCmludCBtYWluKCkgewoJdHlwZWRlZiBmb2xkPCBvcCwgaW50LCBsb25nLCBzaG9ydCwgZG91YmxlLCBmbG9hdD46OnR5cGUgdHlwZTsKCWZvbzx0eXBlPigpOwoJcmV0dXJuIDA7Cn0=