
#include <map> #include <set>
typedef std::map<size_t, size_t> CInt2IntMap; typedef std::set<size_t> CIntSet;
static CInt2IntMap convert(const CIntSet &_r) { CInt2IntMap s; for (CIntSet::const_iterator p = _r.begin(); p != _r.end(); ++p) s.insert(std::make_pair(*p, s.size())); return s; }
Thanks Adam. I found my own solution meanwhile. I tried both, yours and mine. Very slowly I'm getting used to this programming style (grin). The compiler error messages are not very helpful. Kind Regards Peter #include <boost/mpl/map.hpp> #include <boost/mpl/set.hpp> #include <boost/mpl/vector.hpp> #include <iostream> #include <boost/mpl/range_c.hpp> #include <boost/mpl/at.hpp> #include <boost/mpl/placeholders.hpp> #include <boost/mpl/pair.hpp> #include <boost/mpl/size.hpp> #include <boost/mpl/accumulate.hpp> #include <boost/mpl/transform.hpp> #include <boost/mpl/insert.hpp> #include <boost/mpl/equal_to.hpp> #include <boost/mpl/equal.hpp> #include <boost/mpl/assert.hpp> #include <boost/mpl/for_each.hpp> typedef boost::mpl::set< boost::mpl::int_<1>, boost::mpl::int_<3>
CFirstSet;
template<typename CFirstSet> struct CMyConvert:boost::mpl::accumulate< CFirstSet, boost::mpl::map<>, boost::mpl::lambda< boost::mpl::insert< boost::mpl::_1, boost::mpl::pair< boost::mpl::_2, boost::mpl::size<boost::mpl::_1> > > >::type
::type { };
template<typename InputSeq> struct CConvert : boost::mpl::transform< InputSeq, boost::mpl::range_c< long, 0, boost::mpl::size<InputSeq>::value >, boost::mpl::pair<boost::mpl::_1, boost::mpl::_2>, boost::mpl::inserter< boost::mpl::map<>, boost::mpl::insert<boost::mpl::_1, boost::mpl::_2> >
::type { };
typedef boost::mpl::map< boost::mpl::pair< boost::mpl::int_<3>, boost::mpl::integral_c<long, 0> >, boost::mpl::pair< boost::mpl::int_<1>, boost::mpl::integral_c<long, 1> >
CMap1;
typedef boost::mpl::map< boost::mpl::pair< boost::mpl::int_<3>, boost::mpl::long_<0> >, boost::mpl::pair< boost::mpl::int_<1>, boost::mpl::long_<1> >
CMap2;
template<typename T> struct wrap { }; struct CPrintType { template<typename T> void operator()(wrap<T>) const { std::cout << typeid(T).name() << "\n"; } }; int main(int , char **) { BOOST_MPL_ASSERT(( boost::mpl::equal_to< boost::mpl::at< CConvert<CFirstSet>, boost::mpl::int_<1> >::type, boost::mpl::integral_c<long, 1> > )); BOOST_MPL_ASSERT(( boost::mpl::equal_to< boost::mpl::at< CConvert<CFirstSet>, boost::mpl::int_<3> >::type, boost::mpl::integral_c<long, 0> > )); BOOST_MPL_ASSERT(( boost::mpl::equal< CConvert<CFirstSet>, CMap1 > )); BOOST_MPL_ASSERT(( boost::mpl::equal_to< boost::mpl::at< CMyConvert<CFirstSet>, boost::mpl::int_<1> >::type, boost::mpl::long_<1> > )); BOOST_MPL_ASSERT(( boost::mpl::equal_to< boost::mpl::at< CMyConvert<CFirstSet>, boost::mpl::int_<3> >::type, boost::mpl::long_<0> > )); BOOST_MPL_ASSERT(( boost::mpl::equal< CMyConvert<CFirstSet>, CMap2 > )); boost::mpl::for_each< CMyConvert<CFirstSet>, wrap<boost::mpl::_1> >(CPrintType()); return 0; }