There are situations when it would be great to work with all the template parameters like they were in a container. Imagine that we are writing something, such as Boost.Variant:
#include <boost/mpl/aux_/na.hpp>
// boost::mpl::na == n.a. == not available
template <
class T0 = boost::mpl::na,
class T1 = boost::mpl::na,
class T2 = boost::mpl::na,
class T3 = boost::mpl::na,
class T4 = boost::mpl::na,
class T5 = boost::mpl::na,
class T6 = boost::mpl::na,
class T7 = boost::mpl::na,
class T8 = boost::mpl::na,
class T9 = boost::mpl::na
>
struct variant;
The preceding code is the place where all the following interesting tasks start to happen:
- How can we remove constant and volatile qualifiers from all the types?
- How can we remove duplicate types?
- How can we get the sizes of all the types?
- How can we get the maximum...