В C ++ что означает шаблон <>? - PullRequest
16 голосов
/ 02 февраля 2011

Это не синтаксис, с которым я знаком, но я видел его в другой вопрос , например:

template<> struct Allowed<std::string> { };

Что на самом деле означает template<> без типа / параметра шаблона?

Ответы [ 3 ]

20 голосов
/ 02 февраля 2011

Это шаблон специализации.Типичным случаем будет частичная специализация:

#include <iostream>

template<class T1, class T2> struct foo
{
  void doStuff() { std::cout << "generic foo "; }
};

template<class T1>
struct foo<T1, int>
{
 void doStuff() { std::cout << "specific foo with T2=int"; }
};

Как видите, специализация удаляет один элемент из параметров шаблона и явно указывает тип вместо удаленного.Это означает, что если существует только один тип шаблона, <> просто станет пустым:

template<class T1> struct bar
{
  void doStuff() { std::cout << "generic bar"; }
};

template<>
struct bar<int>
{
 void doStuff() { std::cout << "specific bar with T1=int"; }
};
17 голосов
/ 02 февраля 2011

Это специализация.template<> означает, что сама специализация не является шаблонной, то есть это явная специализация, а не частичная специализация.

5 голосов
/ 02 февраля 2011

Вы могли бы просто сказать, что это просто требуемый синтаксис.

Обычный синтаксис будет template< typename T > struct Allowed;

Поскольку мы знаем, что в этом случае T - это std :: string, то естьничего не помещать в угловые скобки, но слово template и угловые скобки по-прежнему необходимы, потому что написание struct Allowed<std::string> само по себе не будет означать, что вы специализируете шаблон, а просто создаете его экземпляр с std :: string в качестве типа,(Слово «struct» не обязательно для этого, но все же разрешено).

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