S式をモデル化する再帰バリアントがあります。
struct sexpr {
typedef boost::variant<
nil,
int,
double,
symbol,
string,
boost::recursive_wrapper<list<sexpr> >
> node_type;
node_type node;
};
空のリストを常にnil
(ではなくlist<sexpr>
)で表すようにします。ただし、push_back()ビジターの実装に固執しています。基になるタイプがの場合、そのタイプをに変更して、指定された値をプッシュバックしnil
たいと思います。list<sexpr>
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_;
};
何か案は?