gpt4 book ai didi

c++ - Boost Spirit和抽象语法树设计

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:34 26 4
gpt4 key购买 nike

我正在使用 Boost Spirit 的 Qi 来解析 VRML 1.0。有一个名为 Separator 的组节点,在 Separator 的正下方,可以容纳许多不同类型的节点。 AST 基于 Boost.Variant,到目前为止看起来很冗长。我快要达到变体中 20 种类型的限制了。我知道我可以扩展变体的类型数量,但我确信必须有更好的方法来设计它。欢迎提出想法。

typedef boost::variant<
Nil,
Coordinate3,
Info,
Material,
MaterialBinding,
Normal,
NormalBinding,
Texture2,
Texture2Transform,
TextureCoordinate2,
ShapeHints,
MatrixTransform,
Rotation,
Scale,
Transform,
Translation,
boost::recursive_wrapper<Separator>
> VRML1Node;

最佳答案

您确定您没有过早优化吗?根据我的经验,变体的“认知开销”不会随着变体中元素类型的数量而增加[1]

你可能想要

Use a type sequence to specify bounded types

typedef mpl::vector< Coordinate3 > types_initial;
typedef mpl::push_front< types_initial, Nil >::type types;

boost::make_variant_over< types >::type VRML1Node;

或者

在这种情况下,您可以采用动态多态性路线,而不是采用静态多态性。

根据您的使用情况,性能不一定会受到严重影响。主要区别是

  1. 要获得完全可优化的访问者代码,您需要使用动态转换,其中变体现在正在为您执行类型删除
  2. 内存分配的局部性可能不是最优的(尽管自定义分配器可能会减轻您的负担)
  3. 存储要求实际上可能会得到改善(变体必须容纳最大的元素类型;当大多数元素类型实际上较小时,将有效分配较少的内存)。

    1. 在实践方面,您可能必须使用 Phoenix(语义 Action )来正确分配属性

我不推荐它,但很明显你甚至可以使用 boost::any

struct poorMansVariant
{
TypeCode discriminator; // TypeCode::Nil, TypeCode::Coordinate3...
boost::any value;
};

[1] 尽管当某些元素类型可转换/可赋值时情况可能会变得稍微复杂,或者通常情况下,它们的构造函数会变得不明确。但那是另一个话题了

关于c++ - Boost Spirit和抽象语法树设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14878938/

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