簡體   English   中英

C ++:可變模板參數(用於遺傳算法)

[英]C++ : variable template parameters (for genetic algorithm)

我正在使用C ++,MPI和CUDA編寫並行進化算法庫。 我需要從面向對象的設計中提取原始數據,並將其粘貼到平面數組(或使用stl-mpi進行std :: vector)中,以將其發送到節點或cuda設備。

完整的設計非常復雜,具有很多繼承關系,以保持庫的靈活性。 但是感興趣的類別是:

基因組類 -包含數據向量。 例如浮子或布爾。

群體類別 -包含基因組對象的向量,並與基因組對象一起定居。

首先創建一個基因組對象,然后將其引用傳遞給種群類構造函數,該構造函數根據傳遞的對象創建自己的基因組載體。 (希望如此!)

所以我想我要向人口類別添加另一個成員向量,例如rawData 但是rawData的類型需要取決於存儲在基因組(或原始基因組對象)中的數據的類型。
據我所知,這就是問題所在,無法動態設置傳遞給模板的類型。

我的偽代碼是

class genome {
    std::vector<bool> data;
}

template <class T>
class population {
    std::vector<genome> population;
    std::vector<T> rawData;
    void PackDataIntoRawData();
};

然后當我創建填充(實際上是另一個類的成員對象)時,我會調用:

genome myBitGenome();
population<type of myBitGenome.data> pop(myBitGenome);

無論如何,有沒有這樣做,或者有人可以建議另一種方法來實現這一點。

提前致謝

我不太了解這個問題。 您是否只需要將“原始數據”轉變為基因組? 為什么需要存儲它? 如果您需要特殊的函數來處理不同種類的原始數據,則不需要模板,只需使用函數重載即可。

就動態類型而言, boost :: variant是一個非常強大的工具。

但是您的問題似乎很簡單,因此我建議您執行以下操作:

template<typename DataPiece>
class Genome {
    typedef std::vector<DataPiece> Data;
    Data data;
}

template <class T_Genome>
class Population {
    std::vector<T_Genome> population;
    typedef typename T_Genome::Data Data;
    Data rawData;
    void PackDataIntoRawData();
};

然后使用它:

typedef Genome<bool> MyGenome;
MyGenome myBItGenome;
Population<MyGenome> pop( myBitGenome );

我不明白為什么您也需要將rawData作為成員存儲。

您是否看過boost序列化庫?

您只需為每個類提供序列化函數或方法。 已經提供了STL集合和基元的方法。

例如

template <class T_Genome>
class Population {
    template<class Archive>
    void serialize(Archive& ar, const unsigned int version)
    {
        using namespace boost::serialization;
        ar & BOOST_SERIALIZATION_NVP(population);
        // ...
    }

    // ...
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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