Boost logo

Boost Users :

From: Angus Leeming (angus.leeming_at_[hidden])
Date: 2004-07-01 06:20:26


Consider a container such as
        std::vector<std::pair<int, std::string> > my_container;

I want to be able to iterate over the ints of this container so, following
the tutorial to the iterator_adaptor docs, came up with

template <typename BaseIterator>
class first_iter
        : public boost::iterator_adaptor<
                first_iter<BaseIterator>,
                BaseIterator,
                boost::use_default,
                boost::use_default,
                typename BaseIterator::value_type::first_type &
>
{
        // snip body
};

This works fine so long as BaseIterator::value_type is not const, but falls
over when it is because I've defined the 'super_t::reference' type to be
mutable.

I guess that I need a piece of metafunction magic, but my naive
implementation fails

        typename boost::mpl::apply_if<
                  boost::is_const<typename BaseIterator::value_type>
                , typename BaseIterator::value_type::first_type const &
                , typename BaseIterator::value_type::first_type &
>::type

trial.C:38: error: no type named `type' in `struct
   boost::mpl::apply_if<
        boost::is_const<std::pair<int, std::string> >,
        const int&,
        int&>'

I must admit I'm a bit baffled. There plainly is a 'type' in the apply_if
class template. Any pointers? I attach the code as I have it.

While I'm at it, is there not something in the MPL that will return the
appropriate const-qualified reference for me? None of the header file
names in boost/mpl jump out and grab me, but I may well be looking in the
wrong place.

Regards,
Angus




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