Я читал современный 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????
Я сомневаюсь, что 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
};
Для того, чтобы шаблон был мгновенно требуется определение. В ваших примерах вы предоставляете только шаблон декларация, который недостаточно чтобы это было мгновенно. Определение дает реализацию, которая подробно описывает, как используются параметры шаблона. Например,
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>
,