To remove all duplicates from a tt(TypeList) all the tt(TypeList)'s first
elements must be erased from the tt(TypeList)'s tail, applying the procedure
recursively to the tt(TypeList)'s tail. The algorithm, outlined below, merely
expects a tt(TypeList):
    itemization(
    it() First, the generic tt(EraseDup) struct template is
declared. tt(EraseDup) structures define a type tt(List) representing the
tt(TypeList) that they generate. tt(EraseDup) calls expect a tt(TypeList) as
their template type parameters:
        verbinclude(//ERASEDUP examples/erase.h)
    it() If the tt(TypeList) is empty it can be returned empty and we're done:
        verbinclude(//ERASEDUPEMPTY examples/erase.h)
    it() In all other cases
        itemization(
        it() tt(EraseDup) is first applied to the original tt(TypeList)'s
tail. By definition this results in a tt(TypeList) from which all
duplicates have been removed;
        it() The tt(TypeList) returned by the previous step might contain the
original tt(TypeList)'s initial type. If so, it is removed by applying
tt(Erase) on the returned tt(TypeList), specifying the original tt(TypeList)'s
initial type as the type to remove;
        it() The returned tt(TypeList) consists of the original tt(TypeList)'s
initial type to which the types of the tt(TypeList) produced by the previous
step are appended.
        )
    This specialization is implemented like this:
        verbinclude(//ERASEDUPHEAD examples/erase.h)
    )
    Here is an example showing how tt(EraseDup) can be used:
        verbinclude(//ERASEDUP examples/erase.cc)
