簡體   English   中英

如何以類似的方式處理不同的模板?

[英]How to handle different templates in a similar way?

我已經處理了幾天的問題,但仍然沒有適當的解決方案。 想象一下,我有幾個(數量可能會有所不同)樂器。 每個儀器產生不同類型的數據。 對於每種樂器,我都有一個結構(我在這里展示了非常簡單的近似值):

struct TInstrument1 {
    int Variable1;
    int Variable2;
}

struct TInstrument2 {
    int Variable3;
} 

我正在嘗試創建一種數據庫來查看可用數據。 我這樣做的方法如下:

首先,我有一個做文件映射的類。 我在 Windows 上編程,所以我在MapFile函數中使用CreateFileCreateFileMappingMapViewOdFile函數:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM