Boost logo

Boost Users :

Subject: [Boost-users] Boost.Variant: Passing visitor as a function argument
From: Hawkes Steve-FSH016 (Steve.Hawkes_at_[hidden])
Date: 2009-09-03 11:51:23


Using the Boost.Variant library, I'm trying to pass a visitor as an
argument to a class method (the class instance contains the objects to
be visited), but I can't come up with a solution that compiles.

For example:
 
typedef std::pair<std::string, double> AttrDouble;
typedef std::pair<std::string, int> AttrInt;
typedef std::pair<std::string, std::string> AttrString;
typedef boost::variant<AttrDouble, AttrInt, AttrString> Attr;
typedef std::vector<Attr> AttrList;

class Example
{
  public:
    // Some code omitted for brevity --

    void visit(boost::static_visitor<> const& visitor)
    {
        BOOST_FOREACH(Attr attr, i_attrList)
        {
            boost::apply_visitor(visitor, attr);
        }
    }

  private:
    AttrList i_attrList;
};

The above gives compiler errors like this:

  boost-1_37/boost/variant/variant.hpp:806: error: no match for call to
'(const boost::static_visitor<void>) (std::pair<std::basic_string<char,
std::char_traits<char>, std::allocator<char> >, double>&)'
  boost-1_37/boost/variant/variant.hpp:806: error: return-statement with
a value, in function returning 'void'

The problem seems to be that static_visitor doesn't actually contain
op()--only the user-supplied derived class does.
 
I've read through the Boost.Variant documentation repeatedly, looked at
Boost.Variant source, and tried searching the Internet for examples, but
I haven't found anything that shows how to do this, leading me to
believe it may not be possible.

Is there a way to pass a visitor as a function argument, or some
alternative approach that allows visiting objects without having direct
access to them (such as when they are class private data and the visitor
is external to the class)?

Thanks,
Steve Hawkes


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net