Динамическое изменение стратегии распределения в boost::vector и boost::matrix.
-
05-09-2019 - |
Вопрос
В моем новом проекте я создаю модуль управления данными. Я хочу предоставить простой тип хранения шаблонов верхним уровням, например
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
шаблон и некоторые определения классов распределителей (шаблонов).
Если вам нужны распределители времени выполнения, то это проще:вы поместите базовый класс (класс определения интерфейса) в шаблон и передадите соответствующие подклассы в зависимости от того, какое условие вам необходимо выполнить.