Boost logo

Boost :

From: Martin Weiser (weiser_at_[hidden])
Date: 2007-06-11 08:32:02

Dear all,

while I appreciate boost::fusion very much, I've recently stumbled across
a point that I don't understand. It appears to me that

- const is transitive, i.e. dereferencing an iterator into a const vector
yields a reference to a const element and

- transformation algorithms work on const sequences.

Combined, these two imply that an in-place modification of a sequence
through a view generated by a transformation algorithm is impossible.
While this is perfectly reasonable for transform, it seems quite
restrictive for filter or erase. After all, filter_view accepts a
non-const input sequence.

My point is probably best illustrated by the following code snippet:

#include <iostream>
#include <boost/type_traits/is_same.hpp>
#include <boost/fusion/algorithm/iteration/for_each.hpp>
#include <boost/fusion/algorithm/transformation/filter.hpp>
#include <boost/fusion/sequence/container/vector.hpp>
#include <boost/fusion/sequence/io/out.hpp>
#include <boost/fusion/sequence/view/filter_view.hpp>

struct SetToZero
  template <typename X>
  void operator()(X& x) const
    x = 0;

int main(void)
  using namespace boost;
  using namespace boost::fusion;

  typedef vector<int,char,double,int> Vec;
  Vec vec(3,'.',1.0,4);
  std::cout << vec << '\n';

  // This does not compile (error: assignment of read-only reference »x«)

  // This works...
  for_each(filter_view<Vec,is_same<mpl::_,int> >(vec),
  std::cout << vec << '\n';
  return 0;

So I'm wondering if this is intended? If yes, how do I best modify (part
of) sequences defined by transformation algorithms?


Dr. Martin Weiser                  web:
Zuse Institute Berlin              mail:    weiser_at_[hidden]
Numerical Analysis and Modelling   pgp key:

Boost list run by bdawes at, gregod at, cpdaniel at, john at