не в состоянии полностью понять, как работают параметры шаблона

Я читал современный C ++ дизайн и не смог полностью понять, как работает параметр шаблона шаблона.

Например, как указано в этой статье http://www.informit.com/articles/article.aspx?p=376878 мы можем создать стек с параметрами шаблона типа и контейнеров.

Если мы используем просто тип и контейнер в качестве параметра для шаблона стека, то это может создать некоторые проблемы, такие как

template <typename T, class Cont>
class Stack;

template <typename> class List;
Stack<int, List<int> > aStack1; // OK
Stack<double, List<int> > aStack2; // legal, not OK
Stack<std::string, Deque<char *> > aStack3; // error!

В приведенном выше коде я могу понять, что aStack1 в порядке, aStack2 и aStack3 являются проблемами, потому что если несовместимые типы между типом элемента Stack и типом элемента контейнера.

Согласно статье это может быть решено, если мы используем параметр шаблона шаблона

template <typename T, template <typename> class Cont>
class Stack;

Stack<int,List> aStack1;
Stack<std::string,Deque> aStack2;

Я сомневаюсь, что Deque знает, что его тип элемента — std :: string или тип элемента List — int ??? Это делается с помощью вывода аргумента шаблона?

Здесь мы создаем Deque с типом T.
Если мы определили стек как

template <typename T,template U, template <typename> class Cont>
class Stack;

тогда как мы можем создать стек

   Stack<std::string,int,Deque> // will this work????

2

Решение

Я сомневаюсь, что Deque знает, что его тип элемента — std :: string или тип элемента List — int ??? Это делается с помощью вывода аргумента шаблона?

Нет, вы явно создаете экземпляр шаблона класса в реализации Stack который может быть реализован как:

template <typename T, template <typename> class Cont>
class Stack
{
Cont<T> _container; //here you use `T` as template argument to `Cont`

Cont<int> _ints; //you can do even this if you need a containter of int.
//though in this case you don't need this.

public:
void push(T const & data)
{
_container.push_back(data);
}
//etc
};
4

Другие решения

Для того, чтобы шаблон был мгновенно требуется определение. В ваших примерах вы предоставляете только шаблон декларация, который недостаточно чтобы это было мгновенно. Определение дает реализацию, которая подробно описывает, как используются параметры шаблона. Например,

template <typename T, template <typename> class Cont>
class Stack : Cont<T>
{
typedef Cont<T> my_container;
public:
using my_container::push_back;
/* more details here */
};

Stack<int,List> aStack1;
Stack<std::string,Deque> aStack2;

инвентарь aStack1 как получено из List<int> а также astack2 как получено из Deque<std::string>,

0

По вопросам рекламы [email protected]