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