16

我已经做了足够的谷歌搜索知道如果我有类似的东西

class SubObject {

public:
//blah blah blah
};

class Aggregate {
public:
   boost::shared_ptr<SubObject>   m_ptr;
};

如果我有一个像这样的虚拟声明,我可以让 Doxygen 创建“正确”的协作图

namespace boost { template<class T> class shared_ptr { T *dummy; }; }

在我的头文件中。

我的问题是:我如何让它适用于我的所有项目和所有标题,而不必在每个文件中实际包含该行?

4

3 回答 3

12

嘿......我觉得回答自己的问题很愚蠢,但我在发布它之后就想出了这个问题:

放上代码片段

namespace boost { template<class T> class shared_ptr { T *dummy; }; }

在名为“doxygen_dummy.h”之类的头文件中,并确保它包含在项目的工作区或目录中。您实际上不需要在任何地方#include 它(实际上,您不想这样做,以避免违反单一定义规则)。您只需要 Doxygen 在扫描所有文件时能够看到它。

于 2010-03-02T14:35:09.753 回答
9

谢谢埃里克,那行得通。但是,我不喜欢额外的虚拟类扩展我的协作图,因此在此基础上进行了更多的酝酿。此 Doxyfile 设置将所有 boost::smart_ptr 代码更改为 T*。这绕过了 smart_ptr 并创建了到协作图中类型的直接链接。

INPUT_FILTER = "sed 's/boost::shared_ptr<\(.*\)>/\1*/'"

这可能不是您想要的最终文档,因为它确实将所有对 smart_ptr 的引用隐藏为普通指针,但协作图变得更具可读性。

于 2012-01-26T03:25:42.473 回答
3

这个问题可能已经过时了,但我尝试了 MattiasF 的解决方案,但它并不完美(我不是在责备)。

IMO,使用 doxygen_dummy 标头不是 shared_ptr 的正确解决方案。shared_ptr 类仅用于内存管理,在 Doxygen 文档中肯定不需要。

在工作中,我使用带有 sed 的 INPUT_FILTER。我找到了一个很好的模式(mem:: 是命名空间别名):

INPUT_FILTER = "sed -e \"s/mem::shared_ptr<\([a-zA-Z0-9_]*\)> /\1* /g\" -e \"s/mem::shared_ptr<\(.*\)> /\1* /g\""

第一个模式匹配所有带有简单模板的 shared_ptr,这意味着没有模板的类型。第二个模式匹配所有其他 shared_ptr 无论模板是复杂类型(带有模板)。

我发现了一个缺点:尚未处理包含'::'的完整名称作为模板。我还没有完成的解决方案是在第一个 sed 的模式中添加一个“字符”::。

于 2015-07-09T09:32:02.597 回答