我广泛使用 Boost 的变体类型来构建树。更准确地说,我使用 Boost 的 Qi 从语法中解析一棵树,然后遍历树以用整数注释每个节点 - 至少这是我想要做的。
我刚刚意识到,由于 static_visitor 不会将节点作为指针访问,因此我不可能修改 value 字段。所以我试图让 static_visitor 在变体类型的指针上工作,而不是变体本身。
一个简化的例子:
typedef struct s_node node;
typedef boost::variant<
int,
boost::recursive_wrapper<node>,
> tree;
struct s_node
{
tree left, right;
double value;
explicit s_node(const expr& l, const expr& r) : oper1(l), oper2(r) { value = -1.0; }
};
struct Traversal : boost::static_visitor<void>
{
void operator()(int *i) const { return; }
void operator()(node *b) {
b->value = 10.0;
}
};
但它不起作用。当我尝试这样做时:
Traversal t;
boost::apply_visitor(t, &tree);
我收到一个错误:
test.cpp:253:21: error: no matching function for call to 'apply_visitor'
...
我怎样才能让 static_visitor 做我想做的事?有一个更好的方法吗?目前,我正在考虑的唯一想法是使节点结构内的字段成为指向 int 的指针,而不是 int。