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

template <typename... Types>
struct Packaging;

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

template <typename T>
struct Packaging<T>
{
	virtual void startPacking(const T&) = 0;
};
 
struct H264en;
struct H265en;
struct Encode
{
	// 定义通用的访问者类型,可以访问H264en和H265en
	typedef Packaging<H264en, H265en> FilePackaging; // 会自动生成H264en和H265en的FilePackaging虚函数,如果要扩展更多访问者类型,则修改Visitor<stA, stB, stC, stD, stE>
	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<H264en&>(en);
		cout << "JpgFilePacking>>" << h.get().c_str() << endl;
	}
	void startPacking(const H265en& en) // 处理H265编码后的工作
	{
		H265en h = const_cast<H265en&>(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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值