Boost logo

Boost Users :

Subject: [Boost-users] How to use mpl::for_each with mpl::map
From: Mark (mark.snelling_at_[hidden])
Date: 2009-04-23 05:23:33


I'm trying to use the runtime mpl::for_each algorithm on an mpl::map
that I have which associates enumerated values to various types.

I want to be able to call a functor for each of the enumerated key
values in the mpl::map but can't get the syntax right, I get the
following compiler error with MSVC 9.0
c:\source\vendor\boost\1_38_0\boost\mpl\pair.hpp(43) : error C2039:
'first' : is not a member of 'boost::mpl::arg<1>'

Any help appreciated.


#include <iostream>
#include <string>

#include <boost/mpl/map.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/key_type.hpp>

namespace mpl = boost::mpl;

enum FieldId

// Map of enumerated types
typedef mpl::map <
       mpl::pair< mpl::int_< Monday >, mpl::identity< int > >,
       mpl::pair< mpl::int_< Tuesday >, mpl::identity< std::string >
       mpl::pair< mpl::int_< Wednesday >, mpl::identity< int > >,
       mpl::pair< mpl::int_< Thursday >, mpl::identity< __int64 > >,
       mpl::pair< mpl::int_< Friday >, mpl::identity< char > >,
       mpl::pair< mpl::int_< Saturday >, mpl::identity< bool > >,
       mpl::pair< mpl::int_< Sunday >, mpl::identity< int > >
> _day_field_types;

// Returns the type for the associated enumeration
template< int FIELD_ID >
struct FieldTypeT : mpl::at< _day_field_types, mpl::int_< FIELD_ID >
>::type {};

// Prints value
struct printer
       template< typename T >
       void operator()( const T& x )
               std::cout << x << std::endl;

int main()
       // Print the associated type for the 'Tuesday' enumeration
       std::cout << typeid( FieldTypeT< Tuesday >::type ).name() <<

       // Print the list of enumerations
>( printer() ); // Compiler error!

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at