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