boost::static_visitor with multiple arguments
The "additional argument" that gets given to each call is the this
pointer. Use it to pass whatever additional information that you need:
#include <boost/variant.hpp>
typedef boost::variant<int, double> Type;
class Append: public boost::static_visitor<>
{
public:
void operator()(int)
{}
void operator()(double)
{}
std::string argument;
};
int main() {
Type type(1.2);
Append visitor;
visitor.argument = "first value";
boost::apply_visitor(visitor, type);
visitor.argument = "new value";
boost::apply_visitor(visitor, type);
}
Another option is to bind the extra arguments. You visitor class could look like this:
class Append: public boost::static_visitor<>
{
public:
void operator()(const std::string&, int)
{}
void operator()(const std::string&, double)
{}
};
Call it like so:
std::string myString = "foo";
double value = 1.2;
auto visitor = std::bind( Append(), myString, std::placeholders::_1 );
boost::apply_visitor( visitor, value );