如何解决如何以类似的方式处理不同的模板?
我已经解决问题好几天了,但仍然没有适当的解决方案。想象一下,我有几种(数量可能有所不同)的乐器。每种仪器都会产生不同类型的数据。对于每种乐器,我都有一个结构(在这里,我展示了非常简单的近似值):
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)我对数据执行相同的操作,只是类型不同。我非常感谢您的建议。
解决方法
根本原因是您无法对struct
进行自省。
使用class TInstrument1 : public std::tuple<int,int>
可能更好。这将使您可以访问<tuple>
的整个机制。
话虽如此,这可能对您构成挑战。像unsigned int * Num;
和 int size();
这样的代码表明您是入门程序员。在这种情况下,最好的建议是改为使用标准数据库。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。