动态改变boost :: vector和boost :: matrix中的分配策略

时间:2009-04-07 18:38:48

标签: c++ templates boost interprocess allocator

在我的新项目中,我正在构建一个数据管理模块。我想给上层提供一个简单的模板存储类型,如

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

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

我的目标是,用一些不同的分配器来改变数据的分配器,比如Boost.inter进程分配器或Boost.pool分配器(Boost Ublas Matrix和vector类将allocator作为模板参数)。并且只给出一个类和工厂在封面下创建适当的分配器的方法。虚拟基类可能很好但我无法处理如何将它与模板一起使用。您提供了哪种设计模式或解决方案?

编辑:

我将使用boost.pool和boost.shared_memory_allocator.Briefly我希望有不同的类具有不同的分配策略。但我的观点是程序的上半部分应该对它没有任何了解。我的挑战是收集不同的模板具有相同基类的类。

编辑: 对于想要将矩阵类与自定义分配器一起使用的人。

就像这样:

 using boost::numeric::ublas;

    template<typename T, class Allocator = boost::pool_allocator<T>>
    class
    {      
      public:
      matrix<T, row_major, std::vector<T,Allocator>> mData;
    }

2 个答案:

答案 0 :(得分:0)

您是否尝试在编译时基于类型交换分配器?您需要if-else模板和一些分配器类(模板)定义。

如果你想要运行时分配器,那么它就更容易了:你将基类(接口定义类)放在模板中,并根据你需要满足的条件传递适当的子类。

答案 1 :(得分:0)

目前尚不清楚你想要什么,但作为一个黑暗中的镜头,以下是有帮助的吗?

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