cpp/ranges/cartesian product view

@1@ is a range adaptor that takes n s, where n > 0, and produces a  of tuples calculated by the  of the provided ranges. The size of produced view is a multiple of sizes of provided ranges, while each element is a tuple (of references) of the size n.

@2@ is a customization point object.
 * When calling with no argument, is expression-equivalent to.
 * Otherwise, is expression-equivalent to.

@3@ Determines if is a random access range (see also ).

@4@ Determines if is a common range (see also ).

@5@ Determines if is a bidirectional range (see also ).

@6@ Determines if satisfies the helper concept  (see also ).

@7@ Determines if is a sized range (see also ).

@8@ Determines if uses sized sentinel.

@9@ Returns the end of the produced. Participates in overload resolution only if satisfies the helper concept.

@10@ Let be some pack of types, then  denotes:
 * , if is 2,
 * otherwise.

The  passed to  is treated specially, since it is only passed through a single time. As a result, several constrains are relaxed on it:
 * is an instead of ;
 * does not have to be a in order for the  to be  or ;
 * does not have to be in order for the  to be.

Data members
Typical implementations of hold only one non-static data member (shown here as  for exposition only) of type  that holds all adapted  objects.