$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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«)
  for_each(filter<int>(vec),SetToZero());
  // This works...
  for_each(filter_view<Vec,is_same<mpl::_,int> >(vec),
           SetToZero());
  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?
Thanks,
Martin
-- Dr. Martin Weiser web: www.zib.de/weiser Zuse Institute Berlin mail: weiser_at_[hidden] Numerical Analysis and Modelling pgp key: www.zib.de/weiser/weiser.asc