一个多媒体文件可能有不同日期类型的数据,例如 uint8_t、int16_t、float 等。下面三个例子展示了文件内容,第一个字节表示数据类型:
1st File: 0,<uint8 data><uint8 data><uint8 data>...
2nd File: 1,<int16 data><int16 data><int16 data>...
3rd File: 2,<float data><float data><float data>...
FileReader 类读取文件并返回不同类型的 DataStream。我使用 DataStreamBase 以便客户端持有一个指针。
////////////////////////////////////////////////
class FileReader {
DataStreamBase* readFile(string filename) {
switch (first_byte) { // the first byte in a file.
case 0:
return new DataStream<uint8_t>();
case 1:
return new DataStream<int16_t>();
case 2:
return new DataStream<float>();
case 3:
// ... there are many more "case <n>:"
}
return nullptr;
}
};
////////////////////////////////////////////////////
class DataStreamBase {
};
///////////////////////////////////////////////////
template<class T>
class DataStream : public DataStreamBase {
private:
T* data_;
};
///////////////////////////////////////////////////
// client
int main() {
FileReader reader;
DataStreamBase* stream = reader.readFile("some file name");
// Question: how to get a pointer to the data which may be uint8_t, int16_t, or float. Below approach is ugly.
//uint8_t* data = stream->getDataUint8();
//int16_t* data = stream->getDataInt16();
//float* data = stream->getDataFloat();
//...
}
客户端直到运行时才知道输入文件是否包含 uint8_t、int16_t 或浮点数据。
问题:客户端如何获取指向 uint8_t、int16_t、float、...的指针,这些指针可以传递给第三方库?这种设计是解决这类问题的正确方法吗?谢谢。