Enhance each item type by your own attributes/properties, like e.g. adding a normal vector or a FaceHandle to class Vertex.

Efficiency:

Avoid the overhead of virtual inheritance and virtual function calls.

Resolve as many type/attribute dependencies as possible at compile-time instead of testing for attributes at run-time (e.g. normal vectors for faces).

Type-safety for handles, no type-casting (*): Vertices, (Half-)Edges, Faces know each other and their corresponding handles.

(*) Since version 0.10.0 the Microsoft VisualC++ compiler is supported. Due to the compilers inaptitude to process forwards on template functions correctly, the type-safety had to be given up to some extend. Though under the hood void pointers are used, the casting is done within the mesh, and the user transparently uses his handles as before.
As soon as the compiler adheres to the C++ standard the type-safe version will be restored.