[Sorry if this was sent twice, but it appears to me that I didn't actually hit "Send" the first time...]

On Mon, Nov 14, 2011 at 12:26 PM, paul Fultz <pfultz2@yahoo.com> wrote:
Hi,
I have class that takes an mpl sequence as its parameter like this:
X<mpl::vector<A, B, C> >
And I would like to be able to have the class be used without explicitly declaring the mpl sequence like this:
X<A, B, C>
I know this could be accomplished using variadic template parameters, but I am using an older compiler. I was wondering if there was a macro in boost to do this, such as:
template<BOOST_MPL_VARIADIC_PARAM_PACK(T)>
class X
{
typedef mpl::vector<BOOST_MPL_VARIADIC_PARAM_UNPACK(T)> type;
};
If a macro is not available, does anyone know how I could write a macro like this? Or what is the default type used for mpl sequences when a type is unspecified?

I think there are a number of ways to do this.  One might be to take advantage of boost::mpl::na, though it looks like technically an implementation detail so its stability could be questionable (defined in <boost/mpl/aux_/na_fwd.hpp>, I believe).  For example:

template< class T0 = boost::mpl::na, class T1 = boost::mpl::na, class T2 = boost::mpl::na, [and so on...] >
struct X
{
    typedef boost::mpl::vector< T0, T1, T2, [and so on...] > type;
};

You can use the Boost.Preprocessor library, e.g., BOOST_PP_ENUM_PARAMS and BOOST_PP_ENUM_BINARY_PARAMS, to make this a lot less repetitious.

- Jeff