2009-04-22 2 views
1

저는 C++, MPI 및 CUDA를 사용하여 병렬 진화 알고리즘 라이브러리를 작성하고 있습니다. 내 객체 지향 디자인에서 원시 데이터를 추출하고 플랫 배열 (또는 std :: vector를 stl-mpi을 사용하여)에 붙여서 노드 나 cuda 디바이스로 전송해야합니다.C++ : 변수 템플릿 매개 변수 (유전자 알고리즘 용)

완전한 디자인은 라이브러리를 유연하게 유지하기 위해 많은 상속과 매우 복잡합니다. 하지만 관심 클래스는 다음과 같습니다 :

게놈 클래스 - 데이터 벡터가 포함되어 있습니다. 예 : 수레 또는 bools.

인구 클래스 - 게놈 개체 벡터를 포함하며 게놈 개체로 초기화됩니다.

처음에는 게놈 개체가 만들어지고, 그 개체에 대한 참조가 전달 된 개체를 기반으로하여 게놈의 자체 벡터를 만드는 채우기 클래스 생성자로 전달됩니다. (희망적 이겠지!)

그래서 다른 멤버 벡터를 추가 할 것이라고 생각합니다. 예를 들어 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); 
     // ... 
    } 

    // ... 
};