Loki::CyclicVisitor

本文介绍了一种基于Loki库实现的CyclicVisitor模式,该模式允许对继承自同一基类的不同派生类进行访问操作。通过定义一个Animal基类及Dog、Cat和Wolf三个派生类,并实现具体的访问者类ConcretVisitor来调用每个对象的方法,展示了如何利用CyclicVisitor简化多态行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Loki::CyclicVisitor类似设计模式中访问者模式
#include <loki/Visitor.h>       // 使用了Loki中的cyclic visitor模板
#include <loki/TypelistMacros.h>
#include <loki/Functor.h>
#include <loki/AssocVector.h>
#include <iostream>
using namespace std;

class Dog;
class Cat;
class Wolf;
typedef   Loki::CyclicVisitor<void, LOKI_TYPELIST_3(Dog, Cat, Wolf)>    MyVisitor;

class Animal
{
public:
    virtual    void    Accept(MyVisitor& v) = 0;
public:
    virtual    void    say(){ cout << "I am Animal class" << endl; }
};

class Dog :public Animal
{
public:
    LOKI_DEFINE_CYCLIC_VISITABLE(MyVisitor)
public:
    void    say(){ cout << "I am Dog" << endl; }
};

class Cat :public Animal
{
public:
    LOKI_DEFINE_CYCLIC_VISITABLE(MyVisitor)
public:
    void    say(){ cout << "I am Cat" << endl; }
};

class Wolf :public Animal
{
public:
    LOKI_DEFINE_CYCLIC_VISITABLE(MyVisitor)
public:
    void    say(){cout<<"I am Wolf"<<endl;}
};

class ConcretVisitor :public MyVisitor
{
public:
    void Visit(Dog& dog)
    {
        dog.say();
    }
    void Visit(Cat& cat)
    {
        cat.say();
    }
    void Visit(Wolf& wolf)
    {
        wolf.say();
    }
};


void testFunc(std::shared_ptr<Animal> pAnimal)
{
    ConcretVisitor cv;
    pAnimal->Accept(cv);
}

int main()
{
    std::shared_ptr<Animal> pDog = std::make_shared<Dog>();
    std::shared_ptr<Animal> pCat = std::make_shared<Cat>();
    std::shared_ptr<Animal> pWolf = std::make_shared<Wolf>();

    testFunc(pDog);
    testFunc(pCat);
    testFunc(pWolf);

    getchar();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值