C++11应用:访问者模式

阅读更多
template 
struct Packaging;

template 
struct Packaging :Packaging
{
	// 通过using避免隐藏函数的startPacking同名方法
	using Packaging::startPacking;
	virtual void startPacking(const T&) = 0;
};

template 
struct Packaging
{
	virtual void startPacking(const T&) = 0;
};
 
struct H264en;
struct H265en;
struct Encode
{
	// 定义通用的访问者类型,可以访问H264en和H265en
	typedef Packaging FilePackaging; // 会自动生成H264en和H265en的FilePackaging虚函数,如果要扩展更多访问者类型,则修改Visitor
	virtual void makeFile(FilePackaging&) = 0;

	string temp;
	string result;
	void put(string str) 
	{
		temp = str;
	}
	const string get()
	{
		return result;
	}
};
struct H264en :Encode 
{
	double val; 
	void makeFile(Encode::FilePackaging& v)
	{ 
		result = "h264en+" + temp + to_string(val);
		v.startPacking(*this);
	} 
};
struct H265en :Encode
{
	int val;
	void makeFile(Encode::FilePackaging& v)
	{ 
		result = "h265en+" + temp + to_string(val);
		v.startPacking(*this);
	} 
};

struct JpgFilePacking :Encode::FilePackaging
{
	void startPacking(const H264en& en) // 处理H264编码后的工作
	{ 
		H264en h = const_cast(en);
		cout << "JpgFilePacking>>" << h.get().c_str() << endl;
	}
	void startPacking(const H265en& en) // 处理H265编码后的工作
	{
		H265en h = const_cast(en);
		cout << "JpgFilePacking>>" << h.get().c_str() << ":" << en.temp << endl;
	}
};

void test() {
	JpgFilePacking tfp;

	string test = "abc"; // 原始数据

	H264en a;
	a.val = 8.97;
	a.put(test);

	H265en b;
	b.val = 8;
	b.put(test);

	a.makeFile(tfp); // 编码同时打包
	b.makeFile(tfp); // 编码同时打包 
}

int main(int, char *[])
{     
	test(); 
	system("pause");
	return 0;
}

 

你可能感兴趣的:(C++11应用:访问者模式)