#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;
}