
Untitled
By: a guest on
Aug 8th, 2012 | syntax:
None | size: 1.18 KB | hits: 7 | expires: Never
Changing boost::variant underlying type from visitor
struct sexpr {
typedef boost::variant<
nil,
int,
double,
symbol,
string,
boost::recursive_wrapper<list<sexpr> >
> node_type;
node_type node;
};
struct push_back_visitor: public boost::static_visitor<void>
{
push_back_visitor(const sexpr &arg): arg_(arg) {}
template <typename T>
void operator()(const T &value) const {
throw bad_visit();
}
void operator()(nil &val) const {
// how to change the underlying type to list<sexpr> here?
// lst.push_back(arg_);
}
void operator()(list<sexpr> &lst) const {
lst.push_back(arg_);
}
sexpr arg_;
};
template<typename Variant, typename Visitor>
struct carry_variant_visitor
: public boost::static_visitor<typename Visitor::result_type>
{
carry_variant_visitor(Variant &variant, Visitor visitor):
variant_(variant), visitor_(visitor) { }
template<typename T>
typename Visitor::result_type operator()(T &t) const {
return visitor_(variant_, t);
}
Variant &variant_;
Visitor visitor_;
}