Вот пример правильного синтаксиса:
std::uniform_real_distribution<> randomizer(0, 100);
Как это работает, автоматически ли он выдает шаблон объекта? Зачем нужно писать <>
в конце типа? Могу ли я удалить <>
, и он будет таким же?
Вот пример правильного синтаксиса:
std::uniform_real_distribution<> randomizer(0, 100);
Как это работает, автоматически ли он выдает шаблон объекта? Зачем нужно писать <>
в конце типа? Могу ли я удалить <>
, и он будет таким же?
Обычно это можно использовать и работает, когда первый и следующий или единственный параметр имеет аргумент шаблона по умолчанию (тип или значение, если он является интегралом). Дополнительный случай - это когда существует пакет аргументов шаблона и он пуст.
<>
по-прежнему необходимо идентифицировать его как тип шаблона.
В этом типе объявлен как;
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
- конец примера]
Класс имеет следующее объявление
template<class RealType = double>
class uniform_real_distribution;
Как вы видите, у него есть аргумент шаблона по умолчанию типа double
Итак, это объявление
std::uniform_real_distribution<> randomizer(0, 100);
эквивалентно
std::uniform_real_distribution<double> randomizer(0, 100);