Visitor-Pattern 在 Header-Only 环境中的 C++ 中

Visitor-Pattern in C++ in a Header-Only Environment

我目前无法在 C++ 的 Header-Only 库中实现 Visitor-Pattern

考虑以下 class 应该支持访问者访问(为简单起见没有界面):

class Acceptor
{
    void accept(Visitor* v)
    {
        v->visit(this);
    }
};

访客界面如下:

class Visitor
{
    virtual void visit(Acceptor* t) = 0;
};

在 Header-Only 库中,Acceptor.hpp 必须包含 Visitor.hpp,Visitor.hpp 必须包含 Acceptor.hpp。由于 headers 都受到 Include-Guards 的保护,后一个将失败。使用前向声明也不能解决问题。

对于Visitor,一个不完整的Acceptor类型(又名class Acceptor;)就足够了。因此,您可以通过在 Acceptor 中包含 Visitor 来打破循环 #includes,反之亦然。

为了证明这一点,我制作了一个文件-MCVE:

class Acceptor;

class Visitor
{
    friend class Acceptor;

    virtual void visit(Acceptor* t) = 0;
};

class Acceptor
{
    void accept(Visitor* v)
    {
        v->visit(this);
    }
};

Live Demo on coliru

注:

我必须添加 friend class Acceptor 因为 OP 代码的所有成员函数都是 private。然而,即使如此,不完整的类型 class Acceptor 似乎也足够了。


有单独的文件:

文件visitor.h:

#ifndef VISITOR_H
#define VISITOR_H

class Acceptor;

class Visitor
{
    friend class Acceptor;

    virtual void visit(Acceptor* t) = 0;
};

#endif // VISITOR_H

文件acceptor.h:

#ifndef ACCEPTOR_H
#define ACCEPTOR_H

#include "visitor.h"

class Acceptor
{
    void accept(Visitor* v)
    {
        v->visit(this);
    }
};

#endif // ACCEPTOR_H