C++11 Visitor--改进访问者模式

// Visitor.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include 
using namespace std;

template
struct Visitor;

template
struct Visitor :Visitor
{
	// 通过using 避免隐藏基类的Visit同名方法
	using Visitor::Visit;
	virtual void Visit(const T&) = 0;
};

template
struct Visitor
{
	virtual void Visit(const T&) = 0;
};

struct stA;
struct stB;

struct Base
{
	// 定义通用的访问者类型,它可以访问stA和stB
	typedef Visitor MyVisitor;
	virtual void Accept(MyVisitor&) = 0;
};

struct stA :Base
{
	double val;
	void Accept(Base::MyVisitor& v)
	{
		v.Visit(*this);
	}
};

struct stB :Base 
{
	int val;
	void Accept(Base::MyVisitor&v)
	{
		v.Visit(*this);
	}
};

struct PrintVisitor :Base::MyVisitor
{
	void Visit(const stA& a)
	{
		cout << "from stA: " << a.val << endl;
	}
	void Visit(const stB& b)
	{
		cout << "from stB: " << b.val << endl;
	}
};
int main()
{
	PrintVisitor vis;
	stA a;
	a.val = 8.97;
	stB b;
	b.val = 8;
	Base* base = &a;
	base->Accept(vis);
	base = &b;
	base->Accept(vis);
}


运行结果:

你可能感兴趣的:(c++)