#include <iostream>
struct None
{
};
template<int val, class link>
struct TNode
{
enum { value = val };
typedef link next;
};
enum
{
Car,
Boat,
Heli,
Plane
};
typedef TNode<Car, TNode<Boat, TNode<Heli, TNode<Plane, None> > > > Vechicles;
void RegisterVechicle(int i)
{
std::cout<< "registered: " << i << std::endl;
}
template<typename T>
struct Register
{
static inline void Do()
{
RegisterVechicle(T::value);
Register<typename T::next>::Do();
}
};
template<>
struct Register<None>
{
static inline void Do()
{
}
};
int main()
{
Register<Vechicles>::Do();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IE5vbmUKewp9OwoKdGVtcGxhdGU8aW50IHZhbCwgY2xhc3MgbGluaz4Kc3RydWN0IFROb2RlCnsKICBlbnVtIHsgdmFsdWUgPSB2YWwgfTsKICB0eXBlZGVmIGxpbmsgbmV4dDsgCn07CgplbnVtCnsKICBDYXIsCiAgQm9hdCwKICBIZWxpLAogIFBsYW5lCn07Cgp0eXBlZGVmIFROb2RlPENhciwgVE5vZGU8Qm9hdCwgVE5vZGU8SGVsaSwgVE5vZGU8UGxhbmUsIE5vbmU+ID4gPiA+IFZlY2hpY2xlczsKCnZvaWQgUmVnaXN0ZXJWZWNoaWNsZShpbnQgaSkKewogIHN0ZDo6Y291dDw8ICJyZWdpc3RlcmVkOiAiIDw8IGkgPDwgc3RkOjplbmRsOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgUmVnaXN0ZXIKewogIHN0YXRpYyBpbmxpbmUgdm9pZCBEbygpCiAgewogICAgUmVnaXN0ZXJWZWNoaWNsZShUOjp2YWx1ZSk7CiAgICBSZWdpc3Rlcjx0eXBlbmFtZSBUOjpuZXh0Pjo6RG8oKTsKICB9Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBSZWdpc3RlcjxOb25lPgp7CiAgc3RhdGljIGlubGluZSB2b2lkIERvKCkKICB7CiAgfQp9OwoKaW50IG1haW4oKQp7CiAgUmVnaXN0ZXI8VmVjaGljbGVzPjo6RG8oKTsKICByZXR1cm4gMDsKfQ==