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

时间:2014-04-21 19:44:21

标签: c++ boost boost-spirit

因为我有一个类:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

这里有如此多的下意识反应:

  1. 确实,不要在这里使用指针
  2. Rule Of Zero
  3. 我的意思是,重新考虑你的问题。是的,我可以想到一些方法可以解决回溯泄漏的问题,但它们都是丑陋的,容易出错的,最重要的是可能不需要。

    让我们考虑一下。

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

      嗯,最合理的解释是该版本可能具有较大的附加数据和其他内容(序列化策略,日志记录,验证结果等等。Version可以添加任何可以想象的运行时多态行为。

      此信息将是&#34;外部&#34;任何属于&#34;属于#34;到一个版本,所以这个版本&#34;元信息&#34;不会被拥有并提到多态。

    2. 这是什么意思?

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

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

      让我们说你没有这个&#34;版本表&#34;一开始就有。在所有可能性中,您不希望AST中的每个节点最终都有自己唯一的Version实例,即使它引用了相同的版本。因此,您应该创建一个

      的工厂函数
      • 维持&#34;共享&#34; (唯一)版本表
      • 能够在解析过程中查找版本项(因此您可以在解析的节点中设置Version*
      • 可选地实例化新的Version对象,如果 - 且仅当 - 它在查找时尚未出现

      现在,此表可以是所有Version个实例的所有者,只需在您完成这些操作后立即将其全部释放。