$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Istvan Buki (buki.istvan_at_[hidden])
Date: 2008-06-03 08:20:20
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_at_[hidden]>
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_at_[hidden]
> http://listarchives.boost.org/mailman/listinfo.cgi/boost-users
>