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

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

#include "pch.h"
#include <iostream>
using namespace std;

template<typename... Types>
struct Visitor;

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

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

struct stA;
struct stB;

struct Base
{
	// 定义通用的访问者类型,它可以访问stA和stB
	typedef Visitor<stA, stB> 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);
}


运行结果:

猜你喜欢

转载自blog.csdn.net/zang141588761/article/details/85677573