Динамическое изменение стратегии распределения в boost::vector и boost::matrix.

StackOverflow https://stackoverflow.com/questions/727066

Вопрос

В моем новом проекте я создаю модуль управления данными. Я хочу предоставить простой тип хранения шаблонов верхним уровням, например

template<typename T>
class Data
{
 public:
  T getValue();
 private:

 boost::numeric::ublas::matrix<T> data;
}

Моя цель состоит в том, чтобы изменить распределитель данных с помощью нескольких разных распределителей, таких как распределитель процессов Boost.inter или распределитель Boost.pool (матрица Boost Ublas и векторные классы принимают распределитель в качестве параметра шаблона). И дать только один класс и фабричный метод для создания соответствующий распределитель под прикрытием. Виртуальный базовый класс мог бы быть приятным, но я не мог понять, как использовать его с шаблонами. Какие шаблоны проектирования или решения вы предлагаете?

Редактировать:

Я буду использовать boost.pool и boost.shared_memory_allocator. Короче говоря, я хочу иметь разные классы с разными стратегиями распределения. Но я хочу сказать, что верхние части программы не должны ничего об этом знать. Настоящая задача для меня — собрать разные классы шаблонов с помощью идентичные базовые классы.

Редактировать:Для тех, кто хочет использовать матричный класс с собственным распределителем.

это так:

 using boost::numeric::ublas;

    template<typename T, class Allocator = boost::pool_allocator<T>>
    class
    {      
      public:
      matrix<T, row_major, std::vector<T,Allocator>> mData;
    }
Это было полезно?

Решение

Непонятно, чего вы хотите, но в качестве выстрела в темноте полезно ли следующее?

template<typename T>
class IData
{
 public:
  virtual T getValue() = 0;
  virtual ~IData() {}
};

template<typename T, typename Allocator=std::allocator<T> >
class Data : public IData<T>
{
 public:
  virtual T getValue();
 private:

 boost::numeric::ublas::matrix<T, Allocator> data;
}

Другие советы

Вы пытаетесь поменять местами распределители во время компиляции в зависимости от типа?Вам понадобится if-else шаблон и некоторые определения классов распределителей (шаблонов).

Если вам нужны распределители времени выполнения, то это проще:вы поместите базовый класс (класс определения интерфейса) в шаблон и передадите соответствующие подклассы в зависимости от того, какое условие вам необходимо выполнить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top