Loki库里的Acyclic Visitor

原创 2007年09月19日 16:16:00

已经知道,使用 Visitor有这样那样的不便。Loki为了避免这些提供了两个方案,之一就是Acyclic的类库化。

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

template    
<class T,typename R = void>
class Visitor
...{
public:
    typedef    R    ReturnType;
    
virtual    ReturnType    Visit(T&)    = 0;
}
;

你的访问者必须继承这两个类,具体的情况可能是:

class MyVisitor
    :
public    BaseVisitor
    ,
public    Visitor<A>
    ,
public    Visitor<B>
...{
public:
    
void    Visit(A&);    //visit A
    void    Visit(B&);    //visit B
}

使用起来很简单,记得继承和根据自己的特定类编写特定Visit方法就可以了。对于Visitable:

template    <typename    R = void>
class    BaseVisitable
...{
public:
    typedef    R    ReturnType;
    
virtual    ~BaseVisitable()...{};
    
virtual    ReturnType    Accept(BaseVisitor&)    = 0;
protected:
    template    
<class T>
    
static    ReturnType    AcceptImpl(T& visited,BaseVisitor& guest)
    
...{
        
if (Visitor<T>* p = dynamic_cast<Visitor<T>*>(&guest))
        
...{
            
return    p->Visit(visited);
        }

        
return    ReturnType();
    }

}
;

#define    DEFINE_VISITABLE()    
    
virtual    ReturnType    Accept(BaseVisitor& guest)    
    
...{return    AcceptImpl(*this,guest);}

你已经猜到,你的Visitable必须继承BaseVisitable,但是,Visit是要动态转换的,这个调用地方必须在子类中,放在基类中动态转换没有任何意义。为了提供侵入用户类的方便手段,loki定义了DEFINE_VISITABLE()宏,如果你对MFC有一定了解的话,你一定会觉得这种手法很熟悉。

当然,侵入宏只是为了只是动态转换,如果你需要,自己写也没什么,你还可以获得应有的自由度。

这样,一般的使用BaseVisitable的方法是:

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

把宏替换为它的定义代码,修改Accept的实现就可以自定义AcceptImpl的行为。

loki库之内存池SmallObj

[原创]loki库之内存池SmallObj http://www.cnblogs.com/UnGeek/p/4537114.html loki库之内存池SmallObj ...
  • zdy0_2004
  • zdy0_2004
  • 2015年05月29日 22:50
  • 1067

设计模式总结之Visitor Pattern(访问者模式)

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。...
  • cooldragon
  • cooldragon
  • 2016年08月12日 12:10
  • 3777

小技巧绕过Sina Visitor System(新浪访客系统)

0x00 前言 一直以来,爬虫与反爬虫技术都时刻进行着博弈,而新浪微博作为一个数据大户更是在反爬虫上不遗余力。常规手段如验证码、封IP等等相信很多人都见识过…… 当然确实有需要的话可以通过...
  • u013474557
  • u013474557
  • 2015年01月03日 13:27
  • 2865

VA_X_1738增强Microsoft开发环境下的编辑能力识别界面库里的宏

  • 2013年03月21日 11:57
  • 4.98MB
  • 下载

库里韩德武

  • 2014年08月20日 19:34
  • 36KB
  • 下载

Hook编程。如何安装钩子过程,如何编写全局钩子,动态连接库里的全局变量数据共享问题分析。ADO数据库编程。在VB中利用ADO控件和ADO对象访问数据库,在VC中利用ADO技术访问数据库。

  • 2009年05月27日 11:06
  • 14KB
  • 下载

使用zlib库里的compress函数与uncompress函数

文件转自:http://blogold.chinaunix.net/u3/118848/showart_2363489.html zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函...
  • yuucyf
  • yuucyf
  • 2011年04月06日 10:09
  • 2353

调用相机拍照或者从图库里选择图片裁剪后设置到界面

拍照或者从相册中挑选图片设置头像是很常见的功能。同样是网上搜索了资料,知道了可以调用系统的功能实现,然后就试着开始写了。先是布局文件,就是一个ImageView和一个TextView。 ...
  • mouse12138
  • mouse12138
  • 2016年05月11日 15:44
  • 1737

[C/C++标准库]_[初级]_[标准库里提供的排序算法]

sort() stable_sort() partial_sort() reverse() nth_element() qsort() 场景: 1. C/C++的algorithm里提供的算法一...
  • infoworld
  • infoworld
  • 2014年01月27日 15:53
  • 2117

在Eclipse中导入SVN库里的Maven项目

新建SVN项目 a) File --> New --> Other --> SVN     b)  c)  d)  4. 转换项目类型 a)  b...
  • tszxlzc
  • tszxlzc
  • 2016年02月22日 16:08
  • 1811
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Loki库里的Acyclic Visitor
举报原因:
原因补充:

(最多只允许输入30个字)