gpt4 book ai didi

c++ - 如何在 Boost Spirit Qi 中返回堆分配值

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:59 27 4
gpt4 key购买 nike

因为我有一个像这样的类:

 class Test {
void setVersion(Version *version);
Version* version() const;
private:
Version *m_version;
};

我使用 BOOST_FUSION_ADAPT_ADT 对其进行了改编 我想知道如何编写语法规则,这些规则在堆上返回 Version 对象而不会在失败时泄漏。我发现的一种方法是使用

 [_val = phoenix::new_<Version>(Version(0))]

在语义 Action 中,但这对我来说似乎是一个肮脏的解决方法。请注意,通常我不会使用堆分配的对象,但在这种情况下,带有指针的 API 已经固定为这种方式。

最佳答案

这里出现了很多膝跳反射:

  1. 确实,不要在这里使用指针
  2. Rule Of Zero

我的意思是,重新考虑您的问题。是的,我可以想出几种方法来解决回溯泄漏的问题,但它们都很丑陋、容易出错,而且最重要的是可能不需要。

让我们考虑一下。

  1. 为什么 Version 会被非拥有指针引用?

    嗯,最合理的解释是版本可能有大量附加数据和其他东西(序列化策略、日志记录、验证内容等)。Version 可以添加任何可以想象到的运行时多态行为到混合中).

    此信息对于“属于”某个版本的任何对象都是“外部的”,因此不以多态方式拥有和引用此版本“元信息”是有道理的。

  2. 这是什么意思?

    在我看来,这可能意味着在解析过程中可能出现的任何版本都必须在解析开始时已知。在这种情况下,在解析期间根本不需要动态构造(很多很多,可能重复)Version 实例。

  3. 是的,但如果不是呢?

    假设您一开始没有可用的“版本表”。很可能,您不希望 AST 中的每个节点都以它们自己唯一的 Version 实例结束,即使它引用相同的版本。因此,您可能应该制作一个工厂功能

    • 维护(唯一)版本的“共享”表
    • 能够在解析期间查找版本项(因此您可以在解析的节点中设置 Version*)
    • 可选地实例化一个新的 Version 对象,当且仅当 - 它在查找时不存在

    现在这个表可以是所有 Version 实例的所有者,并且可以在您用完它们后立即将它们全部释放。

关于c++ - 如何在 Boost Spirit Qi 中返回堆分配值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204714/

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