To erase the first occurrence of a specified tt(EraseType) from a tt(TypeList)
a recursive algorithm is used once again. The template meta program uses a
generic tt(Erase) struct and several specializations. The specializations
define a type tt(List) containing the resulting tt(TypeList) after the
erasure. Here is the algorithm:
    itemization(
    it() The foundation of the algorithm consists of a struct template
tt(Erase) expecting the type to erase and a tt(TypeList):
            verbinclude(//ERASEPLAIN examples/erase.h)
    it() If the typelist is empty, there's nothing to erase, and an empty
        tt(TypeList) results:
            verbinclude(//ERASEEMPTY examples/erase.h)
    it() If the tt(TypeList)'s head matches the type to erase, then tt(List)
        becomes a tt(TypeList) containing the original tt(TypeList)'s tail
        types:
            verbinclude(//ERASEHEAD examples/erase.h)
    it() In all other cases the erase operation is applied to the
        tt(TypeList)'s tail. This results in a tt(TypeList) to which the
        orginal tt(TypeList)'s head must be prefixed. The tt(TypeList)
        returned by the prefix operation is then returned as tt(Erase::List):
            verbinclude(//ERASENEXT examples/erase.h)
    )
    Here is a statement showing how tt(Erase) can be used:
            verbinclude(//ERASE examples/erase.cc)
