我正在使用C++、MPI和CUDA编写并行进化算法库。我需要从面向对象的设计中提取原始数据,并将其粘贴到平面数组(或std::stl-mpi)中,以便将其发送到节点或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);是否有这样做的,或者有人能建议另一种方式来实现这一点。
提前感谢
发布于 2009-04-22 08:40:56
就动态类型而言,助推::变式是一个非常强大的工具。
但是您的问题似乎相当简单,所以我建议您这样做:
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 );发布于 2009-04-22 08:38:43
我不太明白这个问题。你不需要把“原始数据”转化成基因组吗?你为什么要储存它?如果需要特殊的函数来处理不同类型的原始数据,则不需要模板,只需使用函数重载即可。
发布于 2009-04-22 08:42:53
我不明白为什么您也需要将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);
// ...
}
// ...
};https://stackoverflow.com/questions/776182
复制相似问题