Hello Steven,

thank you very much for your nice and clean solution.
May I ask you to post the variadic version as it is, even if it doesn't compile. I'll try to find how to make it work. It will give me a good starting point to learn more about these techniques.

Istvan


On Mon, Jun 2, 2008 at 7:07 PM, Steven Watanabe <watanabesj@gmail.com> wrote:
AMDG

Istvan Buki wrote:
> 1) Is MPL the right tool to transform a call to
>            get_value< general, age >( a_person )
>    into
>          fusion::at_key< general::age >( fusion::at_key< general >(
> a_person ) )

No not really.

> 2) If it is, could someone provide me some help on how to achieve such
> a result?

Here's a modified form of your example.  I couldn't get the variadic
syntax to compile, so
there is a numeral tacked onto the end of the function name.

#include <boost/fusion/container/map.hpp>
#include <boost/fusion/container/generation/make_map.hpp>
#include <boost/fusion/sequence/intrinsic/at_key.hpp>
#include <boost/type_traits/remove_reference.hpp>
#include <string>
#include <iostream>

namespace result_of {
   template<class M, class K0>
   struct at_key1 : boost::fusion::result_of::at_key<M, K0> {};
   template<class M, class K0, class K1>
   struct at_key2 : boost::fusion::result_of::at_key<typename
boost::remove_reference<typename boost::fusion::result_of::at_key<M,
K0>::type>::type, K1> {};
}

template<class K0, class Map>
typename result_of::at_key1<Map, K0>::type at_key1(Map& m) {
   return(boost::fusion::at_key<K0>(m));
}

template<class K0, class K1, class Map>
typename result_of::at_key2<Map, K0, K1>::type at_key2(Map& m) {
   return(boost::fusion::at_key<K1>(boost::fusion::at_key<K0>(m)));
}

namespace fusion = boost::fusion;

namespace fields
{
 struct general
 {
   struct first_name ;
   struct last_name ;
   struct age ;
 } ;

 struct address
 {
   struct street ;
   struct postal_code ;
   struct country ;
 } ;
}

typedef fusion::map <
 fusion::pair< fields::general::first_name, std::string >,
 fusion::pair< fields::general::last_name, std::string >,
 fusion::pair< fields::general::age, int >
 > general_person ;

typedef fusion::map <
 fusion::pair< fields::address::street, std::string >,
 fusion::pair< fields::address::postal_code, std::string >,
 fusion::pair< fields::address::country, std::string >
 > address_person ;

typedef fusion::map <
 fusion::pair< fields::general, general_person >,
 fusion::pair< fields::address, address_person >
 > person ;

int
main()
{
 using namespace fields ;

 general_person gp =
   fusion::make_map< general::first_name,
   general::last_name, general::age >( "John", "Doe", 99 ) ;

 address_person ap =
   fusion::make_map< address::street,
   address::postal_code, address::country >( "Foo street 1", "12345",
"Barland" ) ;

 person a_person =
   fusion::make_map< general, address >( gp, ap ) ;

 std::cout << "Age: "
//        << fusion::at_key< general::age >( fusion::at_key< general >(
a_person ) )
       << at_key2< general, general::age>( a_person )
       << std::endl ;

 return 0 ;
}

In Christ,
Steven Watanabe

_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users