2009-04-22 18 views
1

私は、C++、MPI、CUDAを使用した並列進化アルゴリズムライブラリを作成しています。オブジェクト指向設計から生データを抽出し、それをノードまたはcudaデバイスに送信するためにフラットな配列(またはstd :: vectorをstl-mpiで使用)に貼り付ける必要があります。C++:可変テンプレートパラメータ(遺伝的アルゴリズム用)

完全な設計は、柔軟なライブラリを維持するために、継承の多くの非常に複雑です。しかし興味のあるクラスは:

ゲノムクラス - データのベクトルを含んでいます。例えば浮動小数点またはbool。

集団クラス - ゲノムオブジェクトのベクターを含み、ゲノムオブジェクトで初期化されています。

まずゲノムオブジェクトが作成され、それへの参照が渡さ1に基づいてゲノムの独自のベクトルを作成し、人口クラスのコンストラクタに渡されます。 (理にかなっている希望!)

は、だから私は、人口のクラスに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はかなり強力なツールです。

しかし、あなたの問題はかなり簡単であると思われるので、私はこのような何かやってお勧めします:

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

感謝。 「生データ」をゲノムに変換するだけでいいですか?なぜあなたはそれを保管する必要がありますか?さまざまな種類の生データを処理する特別な関数が必要な場合は、テンプレートは必要ありません。単純に関数のオーバーロードを使用できます。

+0

逆です。私の人口には、それぞれにデータと他の方法の束が含まれているゲノムのベクトルが含まれています。私はそれらのゲノムからデータを抽出し、それを法線ベクトルに入れます(オブジェクトベクトルではなく、 MPI)。同時に、母集団クラスにはさまざまなタイプのゲノムが使用されるため、固定メンバータイプを母集団に入れることはできません(ベクター rawDataなど)。 – zenna

0

私はあなたが必要とする理由を理解していない:

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(); 
}; 

をし、それを使用しますrawDataをメンバとしても格納します。

あなたはブーストシリアル化の図書館で見たことがありますか?

あなたは自分のクラスごとにシリアル化の関数やメソッドを提供します。 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); 
     // ... 
    } 

    // ... 
}; 
関連する問題