⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_visitor.cpp

📁 Modern C++ Design 一书中实现的程序库
💻 CPP
字号:
#include <iostream>
#include "Visitor.h"

using namespace ::Loki;

class RasterBitmap 
    : public BaseVisitable<>
{
public:
    DEFINE_VISITABLE()
};

class Paragraph
    : public BaseVisitable<>
{
public:
    DEFINE_VISITABLE()
};


class ParagraphEx 
    : public Paragraph
{
public:
    DEFINE_VISITABLE()
};

class DummyParagraph
    : public Paragraph
{
public:
    DEFINE_VISITABLE()
};

class DummyRasterBitmap
    : public RasterBitmap
{
public:
    DEFINE_VISITABLE()
};

class SomeVisitor 
    : public BaseVisitor
    , public Visitor<TYPELIST_3(RasterBitmap, Paragraph, ParagraphEx)>
    , public BaseVisitorImpl<TYPELIST_2(DummyParagraph, DummyRasterBitmap)>
{
public:
     void Visit(RasterBitmap&)
     {
         std::cout << "SomeVisitor::Visit(RasterBitmap&)" << '\n';
     }

     void Visit(Paragraph &)
     {
         std::cout << "SomeVisitor::Visit(Paragraph&)" << '\n';
     }

     void Visit(ParagraphEx &)
     {
         std::cout << "SomeVisitor::Visit(ParagraphEx&)" << '\n';
     }
};


void Test_Visitor()
{
    SomeVisitor     someVisit;
    BaseVisitor    &baseVisit = someVisit;

    RasterBitmap    rast;
    rast.Accept(baseVisit);
    
    Paragraph       par;
    par.Accept(baseVisit);

    ParagraphEx     parEx;
    parEx.Accept(baseVisit);

    DummyRasterBitmap dummyRast;
    dummyRast.Accept(baseVisit);

    DummyParagraph    dummyPar;
    dummyPar.Accept(baseVisit);
}

typedef CyclicVisitor
<
    void,
    TYPELIST_3(class DocElement, class RasterBitmap2, class Paragraph2)
>
MyCyclicVisitor;


class DocElement
{
public:
    virtual void Accept(MyCyclicVisitor &) = 0;
    virtual ~DocElement() {}
};

class RasterBitmap2
    : public DocElement
{
public:
    DEFINE_CYCLIC_VISITABLE(MyCyclicVisitor)
};

class Paragraph2 
    : public DocElement
{
public:
    DEFINE_CYCLIC_VISITABLE(MyCyclicVisitor)
};

class SomeVisitor2
    : public MyCyclicVisitor
{
public:
     void Visit(DocElement &)
     {
         std::cout << "SomeVisitor::Visit(DocElement&)" << '\n';
     }

     void Visit(Paragraph2 &)
     {
         std::cout << "SomeVisitor::Visit(Paragraph2&)" << '\n';
     }

     void Visit(RasterBitmap2 &)
     {
         std::cout << "SomeVisitor::Visit(RasterBitmap2&)" << '\n';
     }
};

void Test_CyclicVisitor()
{
    SomeVisitor2     someVisit;
    MyCyclicVisitor  &baseVisit = someVisit;

    RasterBitmap2   rast;
    rast.Accept(baseVisit);
    
    Paragraph2      par;
    par.Accept(baseVisit);

    DocElement     &docElem1 = par;
    docElem1.Accept(baseVisit);

    DocElement     &docElem2 = rast;
    docElem2.Accept(baseVisit);
}

int main()
{
    Test_Visitor();
    Test_CyclicVisitor();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -