ツリーを構築するために、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 へのポインターにすることです。