Синтаксис шаблонных параметров C ++ - PullRequest
6 голосов
/ 02 сентября 2011

Мне трудно понять синтаксис параметров шаблона шаблона C ++.Я понимаю, почему они полезны, в соответствии с превосходным описанием здесь , я просто нахожу их синтаксис трудным для понимания.Два примера взяты с вышеуказанного веб-сайта (есть и другие):

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

и

template <template <typename,typename> class Cont>
class Wrapper3;

Ясно, что обобщение таких объявлений невозможно без некоторого понимания логического обоснования этого синтаксиса.Запоминание сложнее и, кажется, не очень помогает.

Редактировать: я понимаю, что моя попытка задать вопрос была похожа на наблюдение.Я прошу справку о том, как интерпретировать синтаксис параметра Template Template в повседневной речи.Я могу сделать это с помощью синтаксиса C ++ и всех других языков программирования, которые я выучил.Однако мне трудно "объяснить" синтаксис параметров шаблона C ++ для себя.Я получил книгу Дэвида Вандевурда и Николая М. Йосуттиса «Шаблоны C ++: полное руководство», и, хотя это хорошая книга, она не очень помогла мне понять этот синтаксис, который, я уверен,многие согласятся в лучшем случае странно.

Ответы [ 2 ]

18 голосов
/ 02 сентября 2011

Я не уверен, что именно ваш вопрос, но вот объяснение двух приведенных вами примеров.

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

Stack - шаблон класса с двумя параметрами шаблона. Первый параметр T может быть любого типа (включая встроенные типы, определяемые пользователем типы, создание шаблонов и т. Д.). Второй параметр, Cont, должен быть шаблоном класса, принимающим один параметр. Параметр не назван, потому что он не имеет особого смысла (параметр никогда не привязан ни к чему).

template <template <typename,typename> class Cont>
class Wrapper3;

Wrapper3 - это шаблон класса с одним параметром, Cont. Cont должен быть шаблоном класса с двумя параметрами.

Синтаксис для определения параметра шаблона шаблона такой же, как и для определения шаблона класса (template <typename [param1], typename [param2], ...> class Name), поэтому я не совсем понимаю, в чем ваша проблема.

Однако я согласен с тем, что синтаксис может стать немного неуклюжим, когда вы начнете «вкладывать» параметры шаблона шаблона:

// class template whose parameter must be a class template whose parameter
// must be a class template
template <template <template <typename> class > class C >
struct Wow {};

Но так часто не бывает ...

4 голосов
/ 02 сентября 2011

В этом нет ничего таинственного.Просто извлеките параметры шаблона вашего шаблона из исходного шаблона:

template <typename> class Cont

Подходит любой шаблон класса с аргументом одного типа, например

template <typename T>
class A {
public:
  A(T t) : t_(t) {}
  T get() { return t_; }
private:
  T t_;
};

И вы будете использовать свой оригинальный шаблон как

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