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;
}