[英]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.