提取模板中的常见类行为

时间:2011-11-30 17:38:38

标签: c++ templates generics

我观察到在我的程序中我需要使用以下常见模式制作几个类。它背后的想法是resource_mgr维护一个指向resource对象的引用计数指针列表,并专门控制它们的生命周期。客户端可能无法创建或删除resource个实例,但可能会从resource_mgr请求它们。

class resource_impl
{
    public:
        // ...

    private:
        resource_impl(...);
        ~resource_impl();
        // ...
        friend class resource_mgr;
}

class resource_mgr
{
    public:
        // ...
        shared_ptr<resource_impl> new_resource(...);

    private:
        std::vector<shared_ptr<resource_impl> > resources_;
        static void delete_resource(resource* p); // for shared_ptr
}

我怎么能(或者我可以?)定义模板来捕获这种常见行为? 以下说明了如何使用此模板:

class texture_data
{
    // texture-specific stuff
}

typedef resource_impl<texture_data> texture_impl;
// this makes texture_impl have private *tors and friend resource_mgr<texture_impl>

typedef resource_mgr<texture_impl> texture_mgr;

//...

texture_mgr tmgr;
shared_ptr<texture_impl> texture = tmgr.new_resource(...);

更新: resource_impl的各种实例化都应具有以下属性:

  • 他们有私人构造函数和析构函数
  • 他们的“关联”resource_mgr(管理相同类型资源的经理类)是朋友类(因此它可以创建/销毁实例)

1 个答案:

答案 0 :(得分:4)

首先添加界面:

class resource_interface
{
  public:
    virtual ~resource_interface() = 0;
    virtual void foo() = 0;
};

然后将resource_impl更改为模板:

template< typename T >
class resource_impl : public T
{
    public:
        // ...

    private:
        resource_impl(...);
        ~resource_impl();
        // ...
        friend template< typename > class resource_mgr;
}

然后将resource_mgr更改为模板:

template< typename T >
class resource_mgr
{
    public:
        // ...
        shared_ptr<T> new_resource(...);

    private:
        std::vector<shared_ptr<T> > resources_;
        static void delete_resource(T* p); // for shared_ptr
}

你应该拥有非常通用的resource_impl和resource_mgr类。