代码之家  ›  专栏  ›  技术社区  ›  Qubeuc

在Boost::Vector和Boost::Matrix中动态更改分配策略

  •  0
  • Qubeuc  · 技术社区  · 16 年前

    在我的新项目中,我正在构建一个数据管理模块。

    template<typename T>
    class Data
    {
     public:
      T getValue();
     private:
    
     boost::numeric::ublas::matrix<T> data;
    }
    

    我的目标是,用一些不同的分配器(如boost.inter-process分配器或boost.pool分配器)来更改数据分配器(boost-ublas矩阵和vector类将分配器作为模板参数)。并且只给一个类和工厂方法来创建适当的分配器。虚拟基类可能很好,但我可以无法处理如何与模板一起使用。您提供哪种设计模式或解决方案?

    编辑:

    我将使用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;
        }
    
    2 回复  |  直到 16 年前
        1
  •  0
  •   Iraimbilanja    16 年前

    不清楚你想要什么,但作为一个暗中拍摄,以下内容有帮助吗?

    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;
    }
    
        2
  •  0
  •   dirkgently    16 年前

    您是否试图在编译时根据类型交换分配器?你需要一个 if-else 模板和一些分配器类(模板)定义。

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