【问题标题】:C++ : variable template parameters (for genetic algorithm)C++:可变模板参数(用于遗传算法)
【发布时间】:2009-04-22 08:24:47
【问题描述】:

我正在使用 C++、MPI 和 CUDA 编写一个并行进化算法库。我需要从面向对象的设计中提取原始数据并将其粘贴到一个平面数组(或使用stl-mpi 的 std::vector)中,以便将其发送到节点或 cuda 设备。

完整的设计相当复杂,有很多继承来保持库的灵活性。但感兴趣的类别是:

基因组类 - 包含数据向量。例如浮点数或布尔值。

Population 类 - 包含基因组对象的向量,并使用基因组对象进行初始化。

首先创建一个基因组对象,然后将对其的引用传递给种群类构造函数,该构造函数根据传递的对象创建自己的基因组向量。 (希望这是有道理的!)

所以我想我会添加另一个成员向量,比如 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);

有没有办法做到这一点,或者任何人都可以提出另一种实现方式。

提前致谢

【问题讨论】:

    标签: c++ templates generics oop


    【解决方案1】:

    就动态类型而言,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 );
    

    【讨论】:

      【解决方案2】:

      我真的不明白这个问题。你不需要把“原始数据”变成基因组吗?为什么需要存储它?如果你需要特殊的函数来处理不同种类的原始数据,你不需要模板,你可以简单地使用函数重载。

      【讨论】:

      • 反过来。我的人口包含一个基因组向量,每个基因组都包含数据和一堆其他方法。我只需要从这些基因组中提取数据并将其放入正常向量(不是对象向量,不能发送对象) MPI)。同时,我不能将固定成员类型放入我的人口中(例如 vector rawData),因为人口类与许多不同类型的基因组一起使用
      【解决方案3】:

      我也不明白为什么需要将 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);
              // ...
          }
      
          // ...
      };
      

      【讨论】:

        猜你喜欢
        • 2012-12-29
        • 2016-05-08
        • 2011-06-11
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        相关资源
        最近更新 更多