源码

使用C模板实现访问者模式


我一直在尝试通过使用C模板来实现访问者模式来减少代码中的样板量.到目前为止,我已经想出了这个:

class BaseVisitor {
public:
    virtual ~BaseVisitor() {}
};

template
class Visitor : public BaseVisitor {
public:
    virtual void visit(T& /* visitable */) = 0;
};

template
class Visitable {
public:
    void accept(Visitor& visitor) {
        visitor.visit(static_cast(*this));
    }
};

Visitable的每个子类都如下所示:

class Mesh : public Object, public Visitable {};
class Text : public Object, public Visitable {};

最后,访客看起来像这样:

class Renderer : public Visitor, public Visitor {}

到目前为止一切都很好……现在问题在于:

for(Scene::iterator it = scene.begin(); it != scene.end(); ++it) {
    Object& object = static_cast(*it);
    if(pre_visit(object)) {
        object.accept(this); ///Erm, what do I cast to??
        post_visit(object);
    }
}

我需要以某种方式转换为Visitable以便我可以调用accept(),但显然我不知道T是什么.或者,我无法向Visitable模板添加虚拟accept(),因为我不知道它应该采用什么参数.

任何C模板大师都知道如何使这项工作?

(0)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/shiyongcmobanshixianfangwenzhemoshi.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:9月 27, 2019 at 04:05 上午

热评文章