Пустые угловые скобки для пользовательских типов - PullRequest
0 голосов
/ 13 мая 2018

Мне известны только 2 варианта использования пустых угловых скобок <> в шаблонах c ++:

1) При полной специализации шаблона, например

template<typename T>
class X
{};

template<>
class X<char>
{};

2Во время вызова шаблонной функции, какой тип аргумента может быть выведен, например,

template<typename T>
T add(T a, T b);

...  

add<>(1, 2);

Но этот случай совершенно новый для меня, и я не могу понять значение такого синтаксиса (пожалуйста, посмотрите на rapidxml::xml_node<>*):

class TestWidget : public GUI::Widget
{
public:
    TestWidget(const std::string& name, rapidxml::xml_node<>* elem);
    // ...
};

Какая семантика дана типу xml_node<> здесь в параметре конструктора ???

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Не в этом случае (аргумент шаблона по умолчанию, как в ответе Jarod42), но этот синтаксис также может объявлять объект типа шаблона с переменным аргументом с пустым списком аргументов шаблона.

Или оба.

#include <iostream>

// default value
template <typename = void>
struct foo
 { };

// variadic list
template <int ...>
struct bar
 { };

// both
template <int = 0, typename ...>
struct foobar
 { };


int main ()
 {    
   foo<>     f;
   bar<>     b;
   foobar<>  fb;
 }

Самое смешное, что вы не можете отличить регистры от объявлений переменных.

0 голосов
/ 13 мая 2018

Существует также аргумент шаблона по умолчанию:

template<typename T = char>
class X
{};

так

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