C ++: переменные параметры шаблона (для генетического алгоритма) - PullRequest
1 голос
/ 22 апреля 2009

Я пишу параллельную библиотеку эволюционных алгоритмов, используя C ++, MPI и CUDA. Мне нужно извлечь необработанные данные из моего объектно-ориентированного дизайна и вставить их в плоский массив (или std :: vector, используя 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);

Есть ли в любом случае, чтобы сделать это, или кто-то может предложить другой способ реализовать это.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 22 апреля 2009

Что касается динамической типизации, boost :: variable - довольно мощный инструмент.

Но ваша проблема кажется довольно простой, поэтому я бы порекомендовал сделать что-то вроде этого:

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 );
0 голосов
/ 22 апреля 2009

Я не понимаю, почему вам нужно хранить rawData в качестве члена.

Вы смотрели библиотеку бустериализации?

Вы просто предоставляете функции или методы сериализации для каждого из ваших классов. Методы для коллекций и примитивов STL уже предоставлены.

1007 * Е.Г. *

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);
        // ...
    }

    // ...
};
0 голосов
/ 22 апреля 2009

Я не совсем понимаю проблему. Разве вам просто не нужно превращать «необработанные данные» в геном? Зачем вам его хранить? Если вам нужны специальные функции для работы с различными видами необработанных данных, вам не нужны шаблоны, вы можете просто использовать перегрузку функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...