Thank you for this work-around Felipe - that will get the job done. Still -
it seems rather a convoluted way to accomplish a task that could be done
with little fuss if boost::apply_visitor accepted a non-const reference to
the visitor instance. I'll use your method to get my task complete but would
still like to understand why it was done this way.
- Thanks
"Felipe Magno de Almeida"
On 1/18/07, cdr@encapsule.com
wrote: Hello,
Why does boost::apply_visitor take a const reference to the visitor object? This forces me to write a boost::static_visitor-derived visitor that looks like this:
class my_visitor_t : public boost::static_visitor<> { template <typename T> void operator()(T const& t) const { // do something ... }
};
... when what I would really like to do is something like this:
class my_visitor_t : public boost::static_visitor<> { my_visitor(my_data & _data) : data(_data) {}
void operator()(int const& i) // NOT const { // data.blah.blah = // blah }
template <typename T> void operator()(T const& t) // NOT const { // data.foo() }
my_data & data
};
So I might have several different instances of a given a my_variant_t:
my_variant_t v1; my_variant_t v2; my_variant_t v3;
my_data_t my_data;
my_visitor_t my_visitor(my_data);
boost::apply_visitor(my_visitor, v1); boost::apply_visitor(my_visitor, v2); // and so on...
... BUT, the fact that I must make the visitor operator() const makes this impossible and is inconsistent with the way that I'm used to leveraging visitors in the BGL. Would someone be kind enough to comment on the rationale behind this? What am I missing here?
Assuming you dont want to return the results of the execution of the visitor into my_data, but to really use it in a non-const way, why dont you do something like this:
struct my_visitor { typedef void result_type;
void operator()(int const&, data&) const { }
template <typename T> void operator()(T const&, data&) const { } };
my_visitor v;
boost::apply_visitor(boost::bind(v, my_data), v1);
Now, if you want to return from the visitor, you should use:
struct visitor { typedef data result_type;
data operator()(int const&) const; template <typename T> data operator()(T const&) const; };
data d = boost::apply_visitor(visitor(), v1);
It have worked for me for a time.
- Thanks
Chris
Best regards, -- Felipe Magno de Almeida