【问题标题】:What does the ampersand do here?&符号在这里做什么?
【发布时间】:2024-04-13 16:10:01
【问题描述】:

我正在尝试理解这部分代码,但遇到了一些我无法解释的内容:

template<unsigned ELEMENT_DIM, class SIM, unsigned SPACE_DIM>
void CellBasedSimulationArchiver<ELEMENT_DIM, SIM, SPACE_DIM>::Save(SIM* pSim)
{
    // Do a bunch of stuff

    boost::archive::text_oarchive* p_arch = arch_opener.GetCommonArchive();

    // Archive the simulation (const-ness would be a pain here)
    (*p_arch) & pSim;  //<--------------- What is this?
}

这个函数的重点是使用 boost 来存档模拟的状态,所以它可以在以后重新加载并继续。我试图了解归档实际上是如何发生的,但是带有箭头的线让我感到困惑。在某些时候,实际的保存必须发生,我猜箭头就是它发生的地方。

boost 肯定有什么问题,但这条线到底是什么意思,&amp; 在这里做什么?它是某种参考吗?我查看了some documentation,它包含&lt;&lt; 运算符,但没有&amp;

【问题讨论】:

  • 您提供的链接确实包含此内容,即ar &amp; a.legs_;。它还在该代码示例上方有文本。
  • 直觉告诉我它在存储在p_arch 的对象上调用operator&amp;,但它看起来有点奇怪,所以我不能100% 确定。特别是因为在这里调用operator &amp; 通常对普通对象没有任何意义。但是 boost 可能会做一些不同的事情。
  • boost 序列化库是滥用运算符重载如何导致痛苦的一个很好的例子。
  • @chris 好的,我找到了你说的那部分,但我仍然没有更聪明
  • @Phill,我对这个库不太熟悉,但是有了operator&,在serialize()中就不需要区分序列化和恢复了。这样,这听起来主要是为了方便。我还建议通过documentation。您链接到的是一本关于 Boost 的书。

标签: c++ pointers boost reference


【解决方案1】:

这里的&符号是二进制&amp; 运算符。对于整数类型,这将是按位 AND 运算符(就像 &lt;&lt; 将是左移运算符),但 boost::archive::text_oarchive 不是整数类型。必须为此类定义了运算符重载函数。因此,此运算符将调用该函数。

根据docs

sa << x
sa & x

这些表达式必须执行完全相同的功能。他们将 x 的值与其他信息一起附加到 sa。此其他信息由存档的实现定义。通常,此信息是相应的加载存档类型正确恢复 x 值所需的信息。

所以,(*p_arch) &amp; pSim;pSim 附加到p_arch 指向的存档中。

【讨论】:

  • 感谢您的回答,这实际上消除了我对该软件包中与归档相关的功能的一大堆误解......现在我要休息一下并思考为什么有人会这样做!