The BOOST_PP_LIST_FOR_EACH_PRODUCT macro repeats a macro for each cartesian product of several lists.

#### Usage

BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, size, tuple)

#### Arguments

macro
  The binary macro of the form macro(r, product). This macro is expanded by BOOST_PP_FOR_EACH_PRODUCT with each cartesian product in tuple. It is expanded with the next available BOOST_PP_FOR repetition and a tuple containing a cartesian product. This tuple will have size elements.
size
  The size of tuple.
tuple
  A tuple of lists from which cartesian products are obtained.

#### Remarks

This macro is a repetition construct. If two lists are (a, (b, (c, BOOST_PP_NIL))) and (x, (y, (z, BOOST_PP_NIL))), this macro will produce the following sequence:
macro(r, (a, x)) macro(r, (a, y)) macro(r, (a, z))
macro(r, (b, x)) macro(r, (b, y)) macro(r, (b, z))
macro(r, (c, x)) macro(r, (c, y)) macro(r, (c, z))
Previously, this macro could not be used inside BOOST_PP_FOR. There is no longer any such restriction. It is more efficient, however, to use BOOST_PP_LIST_FOR_EACH_PRODUCT_R in such a situation.

#### See Also

- BOOST_PP_LIST_FOR_EACH_PRODUCT_R

#### Requirements

Header: <boost/preprocessor/list/for_each_product.hpp>

#### Sample Code

    #include <boost/preprocessor/list/for_each_product.hpp>

    #define L1 (a, (b, (c, BOOST_PP_NIL)))
    #define L2 (x, (y, (z, BOOST_PP_NIL)))

    #define MACRO(r, product) product

    BOOST_PP_LIST_FOR_EACH_PRODUCT(MACRO, 2, (L1, L2))
       // expands to (a, x) (a, y) (a, z) (b, x) (b, y) (b, z) (c, x) (c, y) (c, z)