【问题标题】:How could I "dry" common documentation for common methods through several C++ classes?我如何通过几个 C++ 类为常用方法“干燥”常用文档?
【发布时间】:2015-05-12 22:05:10
【问题描述】:

我正在使用 doxygen 来记录 C++ 库。

假设我有几个类 A、B、C 等,它们共享一组公共方法 A::m1(), B::m1(), ...etc。这些方法在每个类中基本上做同样的事情。

我想要这些常用方法的单一实现。

另一种方法是类(A、B、C 等)继承具有公共方法的公共类。然而,根据我的测量,这种方法在与多继承结合时意味着性能上的轻微牺牲。其实我的一些类继承了其他类,所以多继承是肯定的。

所以,为了“分解”常用方法,我将它们写在一个大宏中。比如:

define COMMON_METHODS() \
void m1() { ..- } \
void m2() { ... \ 

然后,在每个班级,我都放了这个宏。

我知道这可能不是最好的技术(尽管性能非常好)。

现在,我还想为常用方法编写一个文档,并且(文档)由 doxygen 管理和生成。

不幸的是,我找不到或想出某种方式(在 doxygen 的上下文中)来编写一次文档。

因此,如果有人能提供一些技巧或想法让我编写一次文档,我将不胜感激。

问候

【问题讨论】:

  • 一种选择:遭受轻微的性能损失以换取更好的代码可维护性。
  • CRTP 可以帮助您保持常用方法实现 DRY。

标签: c++ doxygen


【解决方案1】:

如果您使用COMMON_METHODS 自动在一堆类中创建某些方法,您可能需要考虑将这些方法封装在模板中,并使用 CRTP。

template <typename C>
class CommonMethods {
    C * me () { return static_cast<C *>(this); }
protected:
    // ... common data members can go here ...
public:
    void m1 () {
        //... use me() if needed ...
    }
    //...
};

class A : public CommonMethods<A>, //...
{
    friend class CommonMethods<A>;
    //...
};

这与所有从公共接口继承的类不同。这种技术没有虚拟接口查找损失。

【讨论】:

  • 非常感谢您的回答@jxh。这听起来是一个完美的解决方案,条件是 doxygen 能够识别所有并生成继承的文档;我想是的;那我去看看无论如何,它看起来比宏观方法要好得多。再次感谢。现在,我想知道是否可以干燥一个普通的构造函数。也就是说,假设公共类共享一个具有相同实现的公共构造函数。有什么方法可以通过 CRTP 实现吗? (或其他方式)
  • 将调用基类的默认构造函数,除非派生对象的构造函数显式调用不同的构造函数。
  • 如果在 doxygen 配置中将 INHERIT_DOCS 设置为 yes,将复制基类文档。
  • 我一直在重构我的一个类并对其进行测试。您建议的方法效果很好,生成了文档并且没有性能损失。因此,送达此便条以表达我的诚挚感谢。最好的问候,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 2011-02-24
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
相关资源
最近更新 更多