A type predicate takes one or more arguments and it is a template. If a type predicate is true it is publicly derived directly or indirectly from true type def. In case it is false it is publicly derived from false type def.

actually this is to give a new name to predefined data types,it is somewhat used so that no one can easily read or understand code: