Подтвердить что ты не робот

Что такое пустой аргумент шаблона <> при создании объекта?

Вот пример правильного синтаксиса:

std::uniform_real_distribution<> randomizer(0, 100);

Как это работает, автоматически ли он выдает шаблон объекта? Зачем нужно писать <> в конце типа? Могу ли я удалить <>, и он будет таким же?

4b9b3361

Ответ 1

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

<> по-прежнему необходимо идентифицировать его как тип шаблона.

В этом типе объявлен как;

template <class RealType = double>
class uniform_real_distribution;

Следовательно, значение по умолчанию RealType для класса шаблона uniform_real_distribution равно double. Он равен std::uniform_real_distribution<double>.


Что касается С++ WD n4527, §14.3/4 (аргументы шаблона)

Когда используются шаблоны аргументов шаблона или аргументы шаблона по умолчанию, список шаблонов шаблонов может быть пустым. В этом случае пустые скобки <> все равно должны использоваться как список шаблонов-аргументов. [Пример:

template<class T = char> class String;
String<>* p; // OK: String<char>
String* q;   // syntax error

template<class ... Elements> class Tuple;
Tuple<>* t; // OK: Elements is empty
Tuple* u;   // syntax error

- конец примера]

Ответ 2

Класс имеет следующее объявление

template<class RealType = double>
class uniform_real_distribution;

Как вы видите, у него есть аргумент шаблона по умолчанию типа double

Итак, это объявление

std::uniform_real_distribution<> randomizer(0, 100);

эквивалентно

std::uniform_real_distribution<double> randomizer(0, 100);