
Steven, your solution is exactly what I needed. My only dream is to be able to manipulate these concepts as well as you do. Thank you very much for your help! On Fri, Jul 18, 2008 at 1:37 AM, Steven Watanabe <watanabesj@gmail.com> wrote:
AMDG
Istvan Buki wrote:
Dear Boost experts,
I'm trying to copy data between different types of fusion sequences with limited success. The example below shows what I'm trying to achieve.
<snip> Does fusion provide a way to achieve what I'm trying to do?
The elements of the map are fusion pair. You need to extract the second element.
#include <boost/fusion/include/vector.hpp> #include <boost/fusion/include/map.hpp> #include <boost/fusion/include/pair.hpp> #include <boost/fusion/include/transform.hpp>
namespace fields { struct i; struct l; struct d; }
template<class F> struct result_of_second;
template<class Self, class Arg1> struct result_of_second<Self(Arg1)> { typedef const typename Arg1::second_type& type; }; template<class Self, class Arg1> struct result_of_second<Self(Arg1&)> { typedef typename Arg1::second_type& type; }; template<class Self, class Arg1> struct result_of_second<Self(const Arg1&)> { typedef const typename Arg1::second_type& type; };
struct second { template<class F> struct result { typedef typename result_of_second<F>::type type; }; template<class T> typename T::second_type& operator()(T& t) const { return(t.second); } template<class T> const typename T::second_type& operator()(const T& t) const { return(t.second); } };
int main() { using namespace boost::fusion ;
typedef map< pair<fields::i, int>, pair<fields::l, long>, pair<fields::d, double>
map_type;
typedef vector<int, long, double> vect_t;
vect_t tup1(1, 2, 3.0); map_type m = tup1; vect_t tup2 = transform(m, second());
// expected result: tup1 == tup2 }
As a side question, I was wondering whether it is possible to synthetize
the vect_t type from map_type (with MPL?)
Indeed it is possible,
typedef result_of::as_vector< mpl::transform< map_type, result_of::second<mpl::_1>, mpl::back_inserter<mpl::vector0<> >
::type ::type vect_t;
In Christ, Steven Watanabe
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users