我已经处理了几天的问题,但仍然没有适当的解决方案。想象一下,我有几种(数量可能不同)乐器。每个仪器产生不同类型的数据。对于每种乐器,我都有一个结构(我在这里展示了非常简单的近似值):
struct TInstrument1 {
int Variable1;
int Variable2;
}
struct TInstrument2 {
int Variable3;
}
我正在尝试创建一种数据库来查看可用数据。我这样做的方式如下:
首先,我有一个做文件映射的类。我在 Windows 上编程,所以我在函数中使用CreateFile
, CreateFileMapping
,函数:MapViewOdFile
MapFile
template <class SType> class TFileMapping {
HANDLE hFile;
HANDLE hFileMap;
SType * MapView;
TFileMapping();
~TFileMapping();
void MapFile(String FileName,DWORD FileAccessType,DWORD FileSharing,DWORD MappingAccessType,DWORD MapViewAccessType,DWORD FlagsAndAttributes,DWORD CreationDisposition,size_t ByteNum);
void UnMapFile();
};
然后在结构中使用这个类TMapVector
(我给出一个简化版本):
template <class SType> struct TMMapVector : public TFileMapping<SType> {
String MappedFileName;
unsigned int * AssignedLen;
unsigned int * Num;
SType * Data;
TMMapVector();
~TMMapVector();
void MapVector(String FileName);
void AppendItem(SType * Val);
int size();
};
这个想法是,例如TMapVector<Instrument1>
创建/打开一个对应于Instrument1
并包含类型对象的数据库文件Instrument1
。
现在我遇到的问题是我不知道用户有多少种仪器。目前有 3 个,但代码应该很容易扩展到更多的仪器类型。目前我处理如下。我有一堂TFileInfo
有两种乐器类型的课,但只有一种被填满。这让我可以进一步使用std::vector<TFileInfo>
. 这种方法的问题在于,每次我需要使用仪器做某事时,我都必须使用 switch 语句:
struct TFileInfo {
TMMapVector<TInstrument1> Instrument1;
TMMapVector<TInstrument2> Instrument2;
};
struct TDataBase {
std::vector<TFileInfo> FileInfo;
std::vector<char> InstrumentType;
int GetNumberOfItemsInArchive(int ArchIdx);
}
int TDataBase::GetNumberOfItemsInArchive(int ArchIdx) {
switch InstrumentType[ArchIdx] {
case 1:
return(FileInfo[ArchIdx].Instrument1.size());
case 2:
return(FileInfo[ArchIdx].Instrument2.size());
}
}
想象一下,如果我需要再添加 10-100 种乐器,当然我不仅有 size() 函数,还有更多。有没有更简单的方法来实现这个?我在考虑接口,但是(1)如果我理解正确的虚函数不能与模板一起使用,(2)我对数据执行相同的操作,只是类型不同。我非常感谢您的建议。