
The kinds of a type to be synthesised and complex classification queries are described by *tag* types.
A tag encapsulates one or more aspects of the kind of type (see reference).
Tags which only encapsulate a single aspect are called *aspect tags* in the following text. These can be used to query, whether a type's kind reflects this aspect:
is_function_type< T, pointer > is_function_type< T, variadic >
Aspects can be *abstract* : In this case several non-abstract possibilities of the same aspect are matched for querying:
I'm not sure that abstract is the right word here, I had to read right through this text a couple of time to understand what you're driving at here: more than one tag, which may be mutually exclusive in the type system. So maybe: "Aspects can also be *abstract*. An abstract tag is the union of one or more tags, which are normally mutually exclusive. They are used when querying a type, if you don't care which of a set of mutually exclusive options is present, for example: is_function_type<T, unbound>::value will be true if T is a function type, a reference to a function, or a pointer to a function." This is still not terribly good English mind you! I also don't like the use of "unbound" here, the name doesn't mean anything to me. I see later on you have "unspecified_decoration", is this the same meaning? If so I very much prefer the latter.
Abstract tag aspects are concretized (see refernce) when used for type synthesis:
I don't think "concretized" is actually a word, but I know what you mean ;-) Maybe someone has a better suggestion? This is definitely going in the right direction IMO. John.