gpt4 book ai didi

c++ - 让 static_visitor 在遍历 Boost 递归变体时修改它?

转载 作者:太空狗 更新时间:2023-10-29 21:43:11 27 4
gpt4 key购买 nike

我广泛使用 Boost 的变体类型来构建树。更准确地说,我使用 Boost 的 Qi 从语法中解析出一棵树,然后我遍历这棵树以用一个整数注释每个节点 - 至少这是我想要做的。

我刚刚意识到,由于 static_visitor 不作为指针访问节点,所以我不可能修改值字段。所以我尝试让 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。

最佳答案

您可以非常多地修改通过引用获取的对象:

    void operator()(int) const { }

void operator()(s_node& b) const {
b.value = 10.0;
}

查看 Live On Coliru ,输出:

Before: s_node {5, s_node {7, 42 /*value: -1*/} /*value: -1*/}
After: s_node {5, s_node {7, 42 /*value: -1*/} /*value: 10*/}

完整示例:

#include <boost/variant.hpp>
#include <iostream>

struct s_node;

typedef boost::variant<
int,
boost::recursive_wrapper<s_node>
> expr;

struct s_node
{
expr oper1, oper2;
double value;

explicit s_node(const expr& l, const expr& r)
: oper1(l), oper2(r), value(-1) { }

friend std::ostream& operator<<(std::ostream& os, s_node const& n) {
return os << "s_node {" << n.oper1 << ", " << n.oper2 << " /*value: " << n.value << "*/}";
}
};

struct Traversal : boost::static_visitor<void>
{
void operator()(int) const { }

void operator()(s_node& b) const {
b.value = 10.0;
}
};

int main()
{
expr x = s_node(5, s_node(7, 42));

std::cout << "Before: " << x << "\n";

boost::apply_visitor(Traversal(), x);

std::cout << "After: " << x << "\n";
}

关于c++ - 让 static_visitor 在遍历 Boost 递归变体时修改它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23599982/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com