Шаблонный класс C ++ с использованием контейнера STL и typedef - PullRequest
2 голосов
/ 11 февраля 2010

У меня есть класс, похожий на этот:

#include <vector>
#include "record.h"
#include "sortcalls.h"

template<
    typename T,
    template<typename , typename Allocator = std::allocator<T> > class Cont = std::vector>
class Sort: public SortCall {

Этот код работает, и я называю его так из других классов:

Comparator c; // comparison functor
Sort< Record, std::vector > s(c);

Теперь я хочу иметь возможность переключать контейнеры на другой контейнер, скажем, список. Поэтому я подумал, что typedef будет аккуратным. Это должно быть что-то вроде

typedef std::vector<Record> container;  // Default record container

template<
    typename T,
    template< typename, typename container > // ???
class Sort: public SortCall {

Ответы [ 3 ]

5 голосов
/ 11 февраля 2010

Не используйте параметры шаблона шаблона ( Cont в вашем коде), они хрупкие и негибкие. Если вам нужно, используйте механизм повторного связывания (например, std :: allocator), но в этом случае вы этого не сделаете:

template<class T, class Cont=std::vector<T> >
struct Sort {
  typedef Cont container_type; // if you need to access it from outside the class
  // similar to std::vector::value_type (which you might want to add here too)
};

typedef Sort<int, std::list<int> > IntListSort;

Сравните со std :: queue и std :: stack, которые также следуют этому шаблону.

0 голосов
/ 11 февраля 2010

Я думаю, может быть проще, если вы используете черты типа. Каждый контейнер в STL и boost имеет номер off typedef, среди них value_type (см. Ссылку http://www.cplusplus.com/reference/stl/vector/). Так что ваш код может выглядеть так:

template<class C>
class sort {
  typedef typename C::value_type value_type; // equivalent to T in your case.
  // similarly you can get allocator, iterator, etc.
0 голосов
/ 11 февраля 2010

Вы должны иметь возможность использовать «container» сразу после typename, как это было в вашем примере. Его спецификация типа будет расширена при запуске компилятора.

Попробуйте скомпилировать ...

...