[英]How to handle different templates in a similar way?
我已經處理了幾天的問題,但仍然沒有適當的解決方案。 想象一下,我有幾個(數量可能會有所不同)樂器。 每個儀器產生不同類型的數據。 對於每種樂器,我都有一個結構(我在這里展示了非常簡單的近似值):
struct TInstrument1 {
int Variable1;
int Variable2;
}
struct TInstrument2 {
int Variable3;
}
我正在嘗試創建一種數據庫來查看可用數據。 我這樣做的方法如下:
首先,我有一個做文件映射的類。 我在 Windows 上編程,所以我在MapFile
函數中使用CreateFile
、 CreateFileMapping
、 MapViewOdFile
函數:
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>
可能更好class TInstrument1 : public std::tuple<int, int>
。 這將使您可以訪問<tuple>
的整個機制。
話雖如此,這對您來說可能是一個挑戰。 類似unsigned int * Num;
代碼unsigned int * Num;
和int size();
表明您是一名初級編碼員。 在這種情況下,更好的建議可能是改用標准數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.