2009-04-22 71 views
1

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

完整的設計很複雜,有很多繼承來保持庫的靈活性。但感興趣的類別是:

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

人口分類 - 包含基因組對象的向量,並初始化爲一個基因組對象。

首先創建一個基因組對象,然後對它的引用傳遞給羣體類構造函數,該構造函數根據傳遞的基因組創建自己的基因組向量。 (希望是有道理的!)

所以我想我會添加另一個成員矢量,說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); 

反正是有做到這一點,或任何人都可以建議另一種方式來實現。

在此先感謝

回答

0

就動態打字而言,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); 
0

我真的不明白這個問題。難道你不需要把「原始數據」變成基因組?爲什麼你需要存儲它?如果你需要特殊的功能來處理不同類型的原始數據,你不需要模板,你可以簡單地使用函數重載。

+0

相反。我的人口包含一組基因組,其中每個基因組都包含數據和一堆其他方法..我需要從這些基因組中提取數據,並將其放入一個法向量(不是對象向量,不能將對象MPI)。同時,我不能在我的人羣中輸入固定的成員類型(例如,矢量 rawData),因爲人口羣與許多不同類型的基因組一起使用 – zenna 2009-04-22 08:43:03

0

我不明白爲什麼你需要將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); 
     // ... 
    } 

    // ... 
};