Boost logo

Boost Users :

From: cp now (cppnow_at_[hidden])
Date: 2008-01-21 11:57:08


Hello.

I am trying to instantiate a template taking two parameters across a series
of types contained in mpl::vector's, and place the resulting types in an
mpl::vector.

template <class A, class B> class T {};
typedef mpl::vector<int, double, char> Atypes;
typedef mpl::vector<double, std::string> Btypes;

template <template <class, class> class TEMPLATE,
   class ATYPE,
   class BTYPES,
   class CLASSES>
struct unary_fold_inner : mpl::fold<
   BTYPES,
   CLASSES,
   mpl::push_back<mpl::_1, TEMPLATE<ATYPE, mpl::_2> >
> {};

template <template <class, class> class TEMPLATE,
   class ATYPES,
   class BTYPES>
struct unary_fold : mpl::fold<
   ATYPES,
   mpl::vector<>,
   typename detail::unary_fold_inner<TEMPLATE, mpl::_2, BTYPES,
mpl::_1>::type
> {};

typedef unary_fold<
   T,
   Atypes,
   Btypes
>::type CLASSES;

I expect CLASSES will be an mpl::vector containing 2x3=6 types as follows:
T<int, double>
T<int, std::string>
T<double, double>
T<double, std::string>
T<char, double>
T<char, std::string>

in other words, instantiating template T across all permutations of Atypes
and Btypes.

What I see instead is puzzling. Classes is indeed an mpl::vector, and indeed
contains 6 types, but the types are simply:
T<double, double>
T<std::string, std::string>
T<double, double>
T<std::string, std::string>
T<double, double>
T<std::string, std::string>

The iteration I'm trying to accomplish is all wrong. I think it has to do
with how I'm creating my metafunctions. I'm still unclear about when the
::type suffix is needed (for the last parameter to mpl::fold<> for example)
and whether I need an "apply" template somewhere in my struct's.

Any help appreciated.

v



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net