Извлечь общее поведение класса в шаблоне - PullRequest
4 голосов
/ 30 ноября 2011

Я заметил, что в моей программе мне нужно было заставить несколько классов использовать следующий общий шаблон.Идея заключается в том, что 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 Ответ

4 голосов
/ 30 ноября 2011

Сначала добавьте интерфейс:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...