Как изменить тип элемента данных с помощью параметра шаблона? - PullRequest
2 голосов
/ 26 марта 2012

Учитывая следующий класс

class Foo {
    struct Bar {
        ...
    };
    ...
    std::deque<Bar> m_bar;
};

Я хочу использовать большинство из них и добавить новую функцию, для которой мне нужно изменить тип m_bar с std::deque в моей версии deque. Я думаю сделать Foo<T> шаблонный класс, где T - это тип deque и наследовать от спецификации для моей версии deque:

class MyFoo : Foo<MyDeque> {
    ...
};

У меня есть два вопроса:

  1. Это хорошая идея?
  2. Если это так, как бы вы изменили объявление класса Foo, чтобы сделать это возможным?

РЕДАКТИРОВАТЬ: Обратите внимание, что MyDeque не имеет такие же параметры шаблона, как std::deque.

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

2) Если MyDeque и std::deque имеют одинаковую подпись шаблона, вы можете передать имя шаблона в качестве параметра шаблона Foo:

#include <deque>

template <class T, class>
struct MyDeque  {
};

template < 
  template<class T, class Alloc = std::allocator<T> > class Container >
class Foo {
  struct Bar {
    int i;
  };
  Container<Bar> m_bar;
};

int main () {
  Foo<std::deque> m_bar;
  Foo<MyDeque> m_bar2;
}

1) Это делает идеальносмысл делать то, что вы просите.В частности, мне нравится делать это таким образом, чтобы я мог легко указать std::list<>, std::vector<> или другие стандартные контейнеры.

Если вы не можете сделать свои подписи шаблонов совместимыми, и если у вас есть функции C ++ 11, вы можете попробовать следующее объявление шаблона:

template < template <typename ...> class Container >
class Foo { … };
1 голос
/ 27 марта 2012

Почему бы просто не сделать адаптер для контейнеров, которые не подходят?Немного измененный код ниже:

#include <deque>

template <class T>
struct MyDeque  {
};


template <class T>
struct StdDequeAdaptor: public std::deque<T> {};

template <
  template<class T> class Container >
  class Foo {
        struct Bar {
                int i;
                  };
          Container<Bar> m_bar;
  };

int main () {
      Foo<StdDequeAdaptor> m_bar;
        Foo<MyDeque> m_bar2;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...